BK: Neue Einträge am Dateianfang anhängen

Hallo,

wie schaffe ich es, neue Formulareinträge am Anfang einer Datei in der sie gespeichert werden  anzuhängen. Es werden Tabellenzeilen gespeichert  (HTML-Code) etwa so:

<tr>
<td width=15%>$field[0]}</td>
<td width=20%>$field[1]</td>
<td>$field[2]</td>
</tr>

mein Script lautet:

#! /usr/bin/perl

use CGI qw(:standard);

$field[0] = param('Datum');
$field[1] = param('Name');
$field[2] = param('Eintrag');

open (datei, ">>../../proddoc-pd/save.txt") die "Die Datei konnte nicht geöffnet werden\n";
print datei"
<tr>
<td width=15%>$field[0]}</td>
<td width=20%>$field[1]</td>
<td>$field[2]</td>
</tr>
\n";
close datei;

Danke!

BK

  1. Hi

    wie schaffe ich es, neue Formulareinträge am Anfang einer Datei in der sie gespeichert werden  anzuhängen.

    ---> Sorry für ein Beispiel habe ich leider keine Zeit, aber du kannst statt etwas anzuhängen (>>) einfach die bestehende Datei erstmal einlesen, dann diese mit den 1.)neuen Einträgen und 2.)bestehenden Daten neu erstellen(>).

  2. Hi !
    Du mußt zunächst die Datei zum Lesen öffnen und den gesamten Inhalt in eine Variable $alt speichern.
    danach öffnest du die Datei zum Überschreiben und schreibst:

    print DATEI"
    <tr>  
    <td width=15%>$field[0]}</td>
    <td width=20%>$field[1]</td>
    <td>$field[2]</td>
    </tr>";

    anschließend fügst Du den in der Variablen $alt gespeicherten Text ein:

    print DATEI $alt

    Das wars !
    Gruß
    Frank

    »

    Hallo,

    wie schaffe ich es, neue Formulareinträge am Anfang einer Datei in der sie gespeichert werden  anzuhängen. Es werden Tabellenzeilen gespeichert  (HTML-Code) etwa so:

    <tr>

    »»  <td width=15%>$field[0]}</td>
    »»  <td width=20%>$field[1]</td>
    »»  <td>$field[2]</td>

    </tr>

    mein Script lautet:

    #! /usr/bin/perl

    use CGI qw(:standard);

    $field[0] = param('Datum');
    $field[1] = param('Name');
    $field[2] = param('Eintrag');

    open (datei, ">>../../proddoc-pd/save.txt") die "Die Datei konnte nicht geöffnet werden\n";
    print datei"
    <tr>

    »»  <td width=15%>$field[0]}</td>
    »»  <td width=20%>$field[1]</td>
    »»  <td>$field[2]</td>

    </tr>
    \n";
    close datei;

    Danke!

    BK

    1. Du mußt zunächst die Datei zum Lesen öffnen und den gesamten Inhalt in eine Variable $alt speichern.
      danach öffnest du die Datei zum Überschreiben und schreibst:

      Das ist eine ziemlich blauäugige Methode, die bei gleichzeitigen Zugriffen in die Hose gehen muß.

      Besser ist es, die Datei zum gleichzeitigen Lese- und Schreibzugriff zu öffnen und Filelocking einzusetzen.

      cu,
      Peter

      1. Hallo Peter,

        Besser ist es, die Datei zum gleichzeitigen Lese- und Schreibzugriff zu öffnen und Filelocking einzusetzen.

        Wie soll ich das realisieren, was ist Filelocking und wie öffnet man eine Datei zum Schreiben und Lesen?
        Bin ein Perl Anfänger.

        Danke!

        BK

        1. Wie soll ich das realisieren, was ist Filelocking

          Filelocking geschieht bei Unix-Systemen über die Systemfunktion flock() und ist eine Empfehlung an andere Programme, auf eine Datei nicht zuzugreifen. Es gibt einen exclusive-Lock, bei dem keine Zugriffe erfolgen sollen und einen shared-Lock, bei dem Lesezugriffe erfolgen können Schreibzugriffe jedoch nicht erfolgen sollen.

          Siehe dazu "perldoc -f flock";

          und wie öffnet man eine Datei zum Schreiben und Lesen?

          In dem Du beim Öffnen des Files ein +< dem Dateinamen voranstellst.

          Dann liest Du die Datei wie gehabt ein, springst mit

          seek FILEHANDLE, 0, 0;

          an den Anfang der Datei und schreibst den neuen Inhalt auf gewohnte Art. Zum Schluß empfiehlt sich ein

          truncate FILEHANDLE, tell FILEHANDLE;

          damit ein evt. vorhandener Rest abgeschnitten wird.

          cu,
          Peter

          1. Siehe dazu "perldoc -f flock";

            und wie öffnet man eine Datei zum Schreiben und Lesen?

            In dem Du beim Öffnen des Files ein +< dem Dateinamen voranstellst.

            Dann liest Du die Datei wie gehabt ein, springst mit

            seek FILEHANDLE, 0, 0;

            an den Anfang der Datei und schreibst den neuen Inhalt auf gewohnte Art. Zum Schluß empfiehlt sich ein

            truncate FILEHANDLE, tell FILEHANDLE;

            damit ein evt. vorhandener Rest abgeschnitten wird.

            Hi,

            ich bin es nocheinmal, verstehe nur wenig von Deinem Tipp, wo gibt es dazu Dokummentation BZW. welche Bücher kannst Du mir da empfelen (PERL), möglichst in Deutsch.
            ist seek Filehandle, 0,0; eine Perlanweisung?

            Sorry, Anfänger

            doch  vielen Dank

            ciao

            Bernhard

            1. ich bin es nocheinmal, verstehe nur wenig von Deinem Tipp, wo gibt es dazu Dokummentation BZW. welche Bücher kannst Du mir da empfelen (PERL), möglichst in Deutsch.

              Programmieren mit Perl und Einführung in Perl. Beide Bücher stammen aus dem O'Reilly-Verlag.

              Wenn Du der englischen Sprache mächtig bist, sollte dir "perldoc" helfen.

              ist seek Filehandle, 0,0; eine Perlanweisung?

              Ja.

              cu,
              Peter

      2. Das ist eine ziemlich blauäugige Methode, die bei gleichzeitigen Zugriffen in die Hose gehen muß.
        Besser ist es, die Datei zum gleichzeitigen Lese- und Schreibzugriff zu öffnen und Filelocking einzusetzen.

        Ein alternativer Ansatz (ebenfalls mit rudimentärer Synchronisation):

        1. Datei $file umbenennen nach $file.alt
        2. Datei $file.neu zum Schreiben öffnen
        3. die neuen Zeilen dorthin ausgeben
        4. $file.$alt lesen und dorthin ausgeben
        5. $file.neu nach $file umbenennen

        Umbenennen sollten normalerweise nicht zwei Prozesse gleichzeitig *erfolgreich* dürfen (Returncode abfragen; Fehlerbehandlung: sleep()-Schleife).