Fehler bei Dateizugriff
Perl-Lerner
- perl
0 Struppi
0 Perl-Lerner0 Perl-Lerner0 Struppi
Jetzt habe ich so ein einfaches Beispiel hergenommen und doch Probleme !
Perl behauptet dass die Datei geschlossen ist, obwohl ich sie unmittelbar davor öffne.
Wo liegt da mein Denkfehler ?
$tc_datei = testdat.txt;
$tc_time = time();
if (-e "$tc_datei")
{ # Datei vorhanden
open ($tc_datei_fh, "$tc_datei");
@tc_datei_inhalt = <$tc_datei_fh>;
close ($tc_datei_fh);
if ($tc_datei_inhalt[0] < $tc_time -120) # mehr als 120 Sekunden vergangen ?
{ # ja - Aktuelle Zeit eintragen
open ($tc_datei_fh, ">$tc_datei");
print $tc_datei_fh $tc_time;
close ($tc_datei_fh);
}
else
{ # nein - Fehlermeldung
HTML_Output(@tbereits_gesendet);
exit(1);
}
}
else
{ # Datei nicht vorhanden
open ($tc_datei_fh, ">$tc_datei");
print $tc_datei_fh $tc_time; # <<< hier Fehler (line 223)
close ($tc_datei_fh);
}
Fehlermeldung im LOG:
print() on closed filehandle $tc_datei_fh at C:/apachefriends/xampp/htdocs/cgi-bin/rtest.pl line 223.
Hallo Perl-Lerner
*g*
Jetzt habe ich so ein einfaches Beispiel hergenommen und doch Probleme !
Perl behauptet dass die Datei geschlossen ist, obwohl ich sie unmittelbar davor öffne.
Wo liegt da mein Denkfehler ?
Erstmal solltest du, gerade wenn du anfängst, alle Perlskripte "strict" machen. D.h. use strict verwenden und sinnvollerweise noch use warnings (oder den -w Switch), dann musst du alle Variabeln mit my oder our deklarieren, das ist zwar am Anfang nervig erspart dir aber die Suche nach Tippfehlern und undefinierten Variabeln.
#!/usr/bin/perl -w
use strict;
$tc_datei = testdat.txt;
Das geht schon mal nicht, was ist
$tc_time = time();
Das müßte dann lauten:
my $tc_datei = 'testdat.txt';
my $tc_time = time();
if (-e "$tc_datei")
Hier sind die Anführungszeichen überflüssig.
{ # Datei vorhanden
open ($tc_datei_fh, "$tc_datei");
und hier solltest du trotzdem prüfen ob open funktioniert hat:
open ($tc_datei_fh, "$tc_datei") or die "Kann $tc_datei nicht öffnen, weil: $!";
und $tc_datei_fh muss mit my deklariert werden.
@tc_datei_inhalt = <$tc_datei_fh>;
Da du nur eine Zeile lesen willst, kannst du hier auch einen Skalar verwenden
close ($tc_datei_fh);
if ($tc_datei_inhalt[0] < $tc_time -120) # mehr als 120 Sekunden vergangen ?
{ # ja - Aktuelle Zeit eintragen
open ($tc_datei_fh, ">$tc_datei");
print $tc_datei_fh $tc_time;
close ($tc_datei_fh);
}
else
{ # nein - Fehlermeldung
HTML_Output(@tbereits_gesendet);
exit(1);
}}
else
{ # Datei nicht vorhanden
open ($tc_datei_fh, ">$tc_datei");
print $tc_datei_fh $tc_time; # <<< hier Fehler (line 223)
close ($tc_datei_fh);
}
So könnte das aussehen:
#!/usr/bin/perl -w
use strict;
my $tc_datei = 'testdat.txt';
my $tc_time = time();
if (-e $tc_datei)
{ # Datei vorhanden
open (my $tc_datei_fh, $tc_datei) or die "Kann Datei $tc_datei nicht öffnen, weil: $!";
my $tc_datei_inhalt = <$tc_datei_fh>;
close ($tc_datei_fh);
if ($tc_datei_inhalt < $tc_time -120) # mehr als 120 Sekunden vergangen ?
{ # ja - Aktuelle Zeit eintragen
open (my $tc_datei_fh, ">$tc_datei") or die "Kann Datei $tc_datei nicht öffnen, weil: $!";
print $tc_datei_fh $tc_time;
close ($tc_datei_fh);
}
else
{ # nein - Fehlermeldung
HTML_Output(@tbereits_gesendet);
exit(1);
}
}
else
{ # Datei nicht vorhanden
open (my $tc_datei_fh, ">$tc_datei")or die "Kann Datei $tc_datei nicht öffnen, weil: $!";
print $tc_datei_fh $tc_time; # <<< hier Fehler (line 223)
close ($tc_datei_fh);
}
Struppi.
Super !
Vielen Dank.
Hallo Struppi,
doch noch eine Frage.
In Deinem Beispiel gibst Du mehrmals 'my $tc_datei_fh' an.
Ist das 'my' tatsächlich immer nötig oder nur einmal.
Und wenn einmal, dann beim statisch erstmaligen Auftritt ?
Perl-Lerner
doch noch eine Frage.
In Deinem Beispiel gibst Du mehrmals 'my $tc_datei_fh' an.
Ist das 'my' tatsächlich immer nötig oder nur einmal.
Und wenn einmal, dann beim statisch erstmaligen Auftritt ?
Durch my gilt eine Variabel nur innerhalb eines Blocks, da du alle open Befehle in anderen Blöcken hast, muss entweder in jedem Block die Variabel neu definiert werden oder einmal global.
Struppi.
Perl-Lerner Danke ===> Perl-Profi
Wieder was gelernt !