Struppi: Öffnen / Schreiben mit +>datei.dat

Beitrag lesen

ich habe mal ne Frage zu
http://de.selfhtml.org/perl/funktionen/einausgabe.htm#open

Dort steht:
+>datei.dat bedeutet: Datei datei.dat zum Lesen und zum Schreiben von Daten öffnen.
Wenn die Datei bereits existiert, wird ihr bisheriger Inhalt überschrieben.
Wenn die Datei noch nicht existiert, wird sie automatisch angelegt.

Ich kriege den bisherigen Inhalt aber nicht ausgelesen,
sondern da steht immer nur das zugefügte "Irgendwas" drin :o(

du benutzt keine Module, kein use strict und läßt dir die Warnungewn nicht anzeigen. Das kann u.U. zusätzliche Arbeit für dich bedeuten. wie auch hier.

Wenn du dein Programm mit:
#!/usr/bin/perl -w

startest, hättest du zumindest eine Meldung bekommen warum das falsch läuft.

open(LOG,"+>$dat") || &fehler("Kann <b>$dat</b> nicht lesen.");

Das '&' Zeichen ist veraltet und hat eine spezielle Bedeutung in aktuelen Perlversionen. Im algemeinen ist es überflüssig und du kannst dir noch ausgeben lassen warum das öffnen scheiterte:

open(LOG,"+>$dat") || fehler("Kann <b>$dat</b> nicht lesen.Weil: $!");

Jetzt hast du die Datei geöffnet und der alte Inhalt wird überschrieben.

flock(LOG, 2) || &fehler("Kein Schreib-Lock auf <b>$dat</b>.");

hier ist es sinnvoll use fnctl einzubinden, ich meine du meinst LOCK_EX

$data = <LOG>;

du liest die Zeile an der der Filezeiger steht ein. Da du die Datei überschreiben willst, steht dieser am Anfang und die Datei ist gelöscht.

chomp($data);

Jetzt versuchst du von einem undefinierten Wert das letzte Zeichen (genauer bis zum ersten vorkommen von $/) abzuschneiden.

$data .= "Irgendwas";

und hier hättest du eine Meldung bekommen:
Use of uninitialized value in scalar chomp at xxx.pl line ...

flock(LOG, 8);

das solltest du nicht machen, da ein close() automatisch ein LOCK_UN ausführt und du so hier - zumindest theoretisch - einen parallen Zugriff haben könntest, bis das ...

close(LOG);

ausgeführt wird.

Ws mache ich falsch ?
Oder ist es sowieso besser,
Öffnen->Lesen->Schliessen und dann neu Öffnen->Schreiben->Schliessen ?

Nein, entweder zum anhängen und lesen öffnen open F, "+>>...." und du musst dich dann mit dem Filezeiger (seek) beschäftigen oder mit open F, "+>...." zum lesen und schrieben öffnen, aber dann musst du vorher erst sicherstellen, dass die Datei vorhanden ist.

Struppi.

--
Javascript ist toll (Perl auch!)