Welche Anweisung ist korrekt?
Chris
- perl
hi,
ich habe folgendes problem. ich möchte mit perl eine datei zum schreiben öffnen und etwas anhängen. welche anweisung ist eurer meinung nach korrekt?
danke chris
p.s. bin perl anfänger und kam auch durch die vielen faqs nicht weiter.
Hoi,
- open(HANLDE, ">>$DATEI");
Die hier.
p.s. bin perl anfänger und kam auch durch die vielen faqs nicht
weiter.
Das rechtfertigt gar nichts. Kauf dir ein Buch oder lies die perldoc.
Gruesse,
c.j.k
hi,
ich habe folgendes problem. ich möchte mit perl eine datei zum schreiben öffnen und etwas anhängen. welche anweisung ist eurer meinung nach korrekt?
- open($DATEI);
oder- open(HANLDE, ">>$DATEI");
open (HANDLE,">>$DATEI") die || print "Datei $DATEI kann nicht geoeffnet werden\n";
flock (HANDLE,2); # nicht unter Windows
print HANDLE "bla bla bla\n";
flock (HANDLE,8); # nicht unter Windows
close (HANDLE);
gruß gregor
hi Chris, hi Gregor
2 Bemerkungen:
open (HANDLE,">>$DATEI") die || print "Datei $DATEI kann nicht geoeffnet werden\n";
Ergänze die open-Anweisung um $!:
open (HANDLE,">>$DATEI") die || print "Datei $DATEI kann nicht geoeffnet werden $!\n";
In der Variable $! steht der Fehlercode des letzten Systemaufrufs. Dann siehst Du auch gleich noch den Grund, wenn das Open fehlschlägt.
danach die Datei für andere Zugriffe sperren:
flock (HANDLE,2); # nicht unter Windows
Richig und sehr wichtig! Es gibt - glaube ich ;-) - durchaus Perl-Distributionen, die flock auch unter Windows unterstützen.
jetzt kannst Du schreiben:
print HANDLE "bla bla bla\n";
nicht vergessen, die Datei wieder freizugeben:
flock (HANDLE,8); # nicht unter Windows
Das solltest Du auf keine Fall tun! Warum? Zwischen diesen beiden Befehlen ist der Prozess unterbrechbar. Du hast keine Einfluß darauf, wann der Prozess mal wieder drankommt... Du gibst hier die Datei frei. Wenn nun der Ablauf des Programms unterbrochen wird und ein anderer Prozess genau zu diesem Zeitpunkt dieselbe Datei beschreibt und schließt, steht dessen Inhalt in der Datei. Nun kommt nach endlicher Zeit Dein Prozess wieder an die Reihe, der das locking aufgehoben hat, und schließt die Datei. Damit landen die im Buffer gespeicherten Daten in der Datei und der vorherige Inhalt ist futsch.
und nun zu das Ding:
close (HANDLE);
Und beim Schließen wird das lock implizit wieder aufgehoben.
Gruß Frank
Moin moin!
open (HANDLE,">>$DATEI") die || print "Datei $DATEI kann nicht geoeffnet werden\n";
^^^^^^^^^^^^ aeh bitte?
Du meinst sicher
open (HANDLE,">> $DATEI") || die("Datei $DATEI kann nicht geoeffnet werden weil: $!");
danach die Datei für andere Zugriffe sperren:
flock (HANDLE,2); # nicht unter Windows
Dazu waeren drei Dinge zu sagen:
1.) Es ist ratsam, Namen statt der Zahlen zu verwenden, damit man einfacher erkennt, was da getan wird. Dazu mit
use Fcntl ':flock';
die Namen fuer die flock-Konstanten importieren und flock dann mit
flock (HANDLE, LOCK_EX);
aufrufen.
2.) flock funktioniert auch unter Windows NT ff., aber vermutlich nicht unter den Spiele-Windowsen (Win95 ff.).
3.) "Datei fuer andere Zugriffe sperren" geht nicht! flock sperrt ueberhaupt nichts, es sagt nur, dass Du *wuenschst*, dass kein anderer Prozess jetzt diese Datei liest oder schreibt. Dazu muss *jeder* andere Prozess diesen Wunsch aber auch respektieren! D.h. er muss auch flock aufrufen. Wenn Du sicher sein kannst, dass nur Deine eigenen Programme die Datei oeffnen (z.B. in CGI-Umgebung ueblich), dann nuetzt Dir flock was, aber sonst nicht.
Spaetestens wenn Dein Programm mehrere Dateien oeffnet, wirst Du mit flock kaum mehr etwas anfangen koennen. Es empfiehlt sich fuer CGI-Scripts dann, andere Synchronisierungsverfahren einzusetzen, wie z.B. das, was ich mal auf http://calocybe.dyndns.org/temp/FileSemaphore/ hingeladen habe. Damit wird aber genauso wie bei flock vorausgesetzt, das nur Programme die fraglichen Dateien oeffnen, die sich an die Regeln halten.
So long
--
Rule of thumb -- every time Microsoft use the word "smart," be on the lookout for something dumb.
-- http://www.fourmilab.ch/webtools/demoroniser/