Siechfred: Datei zum Lesen und Schreiben öffnen

Guten Abend,

wieder mal habe ich ein kleines Perl-Problem. Ich möchte eine Datei öffnen, einlesen, prüfen und dann bei Bedarf eine neue Zeile anhängen. Nun steht hier http://www.perldoc.com/perl5.6.1/pod/func/open.html, dass man "+" und ">>" miteinander kombinieren kann. Dies würde nun bedeuten, dass die Datei zum Lesen und zum Schreiben geöffnet wird, wobei der neue an den alten Inhalt angehängt wird.

Nun habe ich das mal versucht, und es hat nicht funktioniert:

open(LOG, "+>>$datadir/$logfile") or die $!;
my @logentries = <LOG>;
foreach(@logentries) {
  #wenn die Bedingung erfüllt ist, dann
  print LOG "Neue Zeile\n";
}
close(LOG);

Ich bin mit meinem Latein am Ende und kann mir absolut nicht erklären, warum es nicht geht. Wenn ich zwei Operationen draus mache (Zum Lesen öffnen - Schließen; zum Anhängen öffnen - Schließen), geht es problemlos.

mfg Torsten

--
Opinions are like assholes: everybody has one.
ss:| zu:| ls:# fo:| de:[ va:| ch:? n4:& rl:? br:& js:| ie:% fl:( mo:}
  1. Hi,

    Nun steht hier http://www.perldoc.com/perl5.6.1/pod/func/open.html, dass man "+" und ">>" miteinander kombinieren kann.

    ich finde diese Möglichkeit hoffnungslos absurd und empfehle Dir, ihre Existenz zu ignorieren. Öffne eine Datei zum Lesen, wenn Du aus ihr lesen möchtest. Öffne eine Datei zum Schreiben, wenn Du in sie schreiben möchtest. Aber öffne sie nicht zum Schreiben, wenn Du aus ihr lesen möchtest und umgekehrt.

    Wenn ich zwei Operationen draus mache (Zum Lesen öffnen - Schließen; zum Anhängen öffnen - Schließen), geht es problemlos.

    Ja.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Guten Abend,

      ich finde diese Möglichkeit hoffnungslos absurd und empfehle Dir, ihre Existenz zu ignorieren. Öffne eine Datei zum Lesen, wenn Du aus ihr lesen möchtest. Öffne eine Datei zum Schreiben, wenn Du in sie schreiben möchtest. Aber öffne sie nicht zum Schreiben, wenn Du aus ihr lesen möchtest und umgekehrt.

      Die Frage ist nun, warum bietet Perl diese Möglichkeit an, wenn sie böse ist? Hast du eine plausible Erklärung (neben der offensichtlichen Unlogik), warum es nicht geht?

      mfg Torsten

      --
      Opinions are like assholes: everybody has one.
      ss:| zu:| ls:# fo:| de:[ va:| ch:? n4:& rl:? br:& js:| ie:% fl:( mo:}
      1. Hallo,

        Die Frage ist nun, warum bietet Perl diese Möglichkeit an, wenn sie böse ist? Hast du eine plausible Erklärung (neben der offensichtlichen Unlogik), warum es nicht geht?

        Es hat manchmal auch Sinn eine Datei zum Lesen und Schreiben zu öffnen.
        Ich kann dir mal ein Beispiel von mir geben. Meine Webseitenstatistik wurde anfangs immer abwechselnd zum Lesen, dann zum Schreiben geöffnet. Dummerweise kam es dann vor, dass 2 User zur gleichen Zeit dazu führten, dass meine ganze Stastik gelöscht und somit zerstört wurde, obwohl ich flock verwendete. Die einzige Möglichkeit bestand darin, sie gleichzeitig zum Lesen und Schreiben zu öffnen, wie ich mit Hilfe des Forums festgestellt hatte und seither hat es immer funktioniert.
        Eine Datei gleichzeitig zum Lesen und Schreiben zu öffnen, kann also absolut notwenig sein.

        $xNeTworKx.

        --
        Mit Computern lösen wir Probleme, die wir ohne sie gar nicht hätten.
        1. Guten Abend,

          Es hat manchmal auch Sinn eine Datei zum Lesen und Schreiben zu öffnen.
          Ich kann dir mal ein Beispiel von mir geben. [...]

          Genau dies habe ich vor, eine Logdatei, die prüft, ob sich der Besucher innerhalb einer vorgegebenen Zeit schon mal in ein Gästebuch eingetragen hat. Wenn ja, wird er freundlich drauf hingewiesen, wenn nein, wird seine IP nebst Uhrzeit an die Logdatei angehängt und er kann was reinschreiben. Dazu muss ich aber nun mal erst die alten Einträge auslesen.

          mfg Torsten

          --
          Opinions are like assholes: everybody has one.
          ss:| zu:| ls:# fo:| de:[ va:| ch:? n4:& rl:? br:& js:| ie:% fl:( mo:}
          1. Hallo,

            Genau dies habe ich vor, eine Logdatei, die prüft, ob sich der Besucher innerhalb einer vorgegebenen Zeit schon mal in ein Gästebuch eingetragen hat. Wenn ja, wird er freundlich drauf hingewiesen, wenn nein, wird seine IP nebst Uhrzeit an die Logdatei angehängt und er kann was reinschreiben. Dazu muss ich aber nun mal erst die alten Einträge auslesen.

            Ich weiß zwar nicht genau, wie im Endeffekt dein Programm arbeiten wird, aber ich würde die Datei zum Lesen und Schreiben öffnen ( +< ), in dem Moment, wo er etwas hineinschreibt, da ja zur gleichen Zeit die Logdatei von jemanden Anderen geöffnet werden könnte, aber wirklich nur dann.

            $xNeTworKx.

            --
            Mit Computern lösen wir Probleme, die wir ohne sie gar nicht hätten.
  2. Hallo Siechfred,

    wieder mal habe ich ein kleines Perl-Problem. Ich möchte
    eine Datei öffnen, einlesen, prüfen und dann bei Bedarf
    eine neue Zeile anhängen. Nun steht hier
    http://www.perldoc.com/perl5.6.1/pod/func/open.html,
    dass man "+" und ">>" miteinander kombinieren kann. Dies
    würde nun bedeuten, dass die Datei zum Lesen und zum
    Schreiben geöffnet wird, wobei der neue an den alten
    Inhalt angehängt wird.

    Korrekt.

    Nun habe ich das mal versucht, und es hat nicht
    funktioniert:

    Kein Wunder ;)

    open(LOG, "+>>$datadir/$logfile") or die $!;

    Hier ist der Dateizeiger bereits ganz am Ende der Datei.

    my @logentries = <LOG>;

    Und hier versuchst du, vom Ende an noch weiter zu lesen.
    Besser waere also:

    open LOG,'+<'.$datadir.'/'.$logfile or die $!;

    my @entries = <LOG>; # hiermit wird der Dateizeiger ans Ende der Datei gesetzt

    foreach(@entries) {
      print LOG "zeile\n" if dasunddas;
    }

    close LOG;

    Gruesse,
     CK

    --
    http://cforum.teamone.de/
    http://wishlist.tetekum.de/
    If God had meant for us to be in the Army, we would have been born with green, baggy skin.
    1. Hallo CK,

      Kein Wunder ;)
      Hier ist der Dateizeiger bereits ganz am Ende der Datei.

      Ergänzende Frage: Ich könnte doch den Dateizeiger mittels seek(LOG,0,0) am Anfang positionieren und die alten Daten auslesen. Dann müsste der Zeiger doch wieder am Ende der Datei sein und man könnte den neuen Inhalt anhängen. Könnte das so funktionieren?

      mfg Torsten

      --
      Opinions are like assholes: everybody has one.
      ss:| zu:| ls:# fo:| de:[ va:| ch:? n4:& rl:? br:& js:| ie:% fl:( mo:}