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

Beitrag lesen

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.

Bist Du sicher, dass da was kommt ?
Es ist ja noch kein Fehler, wenn nix eingelesen wird, oder ?

Nein, es its eine Warnung, die aber auf Grund dass die Datei gelöscht wird Auftritt und dir Hinweis gegeben hätte.

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:

  1. Danke
    Ich ruf ein sub auf statt die. Wäre vielleicht besser ...

Nein, nicht die.
Das '&' Zeichen brauchst du nicht bei einem Funktionsaufruf, wie gesagt es hat eine spezielle Bedeutung, ist aber i.d.R. überflüssig.

open(LOG,"+>$dat") || fehler("Kann <b>$dat</b> nicht lesen.Weil: $!");
Jetzt hast du die Datei geöffnet und der alte Inhalt wird überschrieben.

Den verstehe ich nicht, weil ich ohne open nicht lesen könnte ...

Es geht nicht um open, sondern um das '>' Zeichen, damit löscht du einen Inhalt.

flock(LOG, 2) || &fehler("Kein Schreib-Lock auf <b>$dat</b>.");
hier ist es sinnvoll use fnctl einzubinden, ich meine du meinst LOCK_EX

Wenn's besser ist, dann 2tes  dickes Danke !

Du bist damit auf der sicheren Seite, ob es besser ist musst du entscheiden.

$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.

Versteh ich nicht.
Mir würde die 1. Zeile reichen, an der der Zeiger steht, aber die wird nicht gelesen ...

Der Zeiger steht am Dateianfang und die Datei wurde mit '>' gelöscht, daher gibt es keine Zeile.

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

Joo, falls sich nen Absatz oder so einschleicht ... nicht wirklich nötig ...

Wie man's nimmt, es ist kein Fehler ein chomp() zu machen.

$data .= "Irgendwas";
und hier hättest du eine Meldung bekommen:
Use of uninitialized value in scalar chomp at xxx.pl line ...

AAAAH, dickes Danke ... wenns denn so ist.
Ich kann da gern ein my vor $data setzen, aber hab dadurch noch immer nix eingelesen :o(

s.o.

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.

Das ALLERDICKSTE DANKE !!!
DAS hab ich mich nämlich schon immer gefragt !!!
(wegen dem theoretischen Gedanken ...)

Theoretisch hast du auch das Problem zwischen open() ... und .. flock(). Aber für solche Spezialitäten gibt es bessere Fachleute hier.

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

Sollte ich wirklich mal !
Aber brauch ich das für 1 Zeile einlesen auch ???

Zum einlesen reicht open F, "datei"; wenn nicht schreiben willst....

oder mit open F, "+>...." zum lesen und schrieben öffnen, aber dann musst du vorher erst sicherstellen, dass die Datei vorhanden ist.

Und das kann ich eben nicht, weil die Datei täglich neu eröffnet werden soll.

Was hält dich davon ab erst zu prüfen ob die Datei vorhanden ist und dann diese anzulegen?
z.b. so:

unless(-e $datei)
{
open F, ">$datei"; close F;
}

Meine Frage bleibt leider.
Warum liest er mit (my) $data = <LOG>; die Datei (1. Zeile) nicht ein.

tut es doch.

Versteh ich noch nicht :o(

Weil du sie beim öffnen mit > löscht.

Ich find auch absolut NIX zu +> im Web (lässt sich auch Sche... nach suchen)
Nutzt das niemand, oder warum ist das so undokumentiert ?

Das steht genau so in selfhtml.

Struppi.

--
Javascript ist toll (Perl auch!)