Markus P.: Einlesen, splitten, aber Ausgabe funkioniert nicht richtig ?

Hallo, ich brauch wieder mal Hilfe,
und zwar : Ich habe ein Flat File, auf dem Daten gespeichert werden, die über ein Formular eingegeben wurden und mit ||| voneinander getrennt sind .So, jetzt mein Problem. Ich muss die Daten ausgeben und will sie somit als Hash einlesen, mit dem Namen als Schlüssel und dem Eingabetext als Wert. Wenn ich das Script mit dem folgenden Ausschnitt laufen lasse, bekomm ich die Ausgabe m, a auf dem Board? (Daten auf dem Flat File bis jetzt markus|||test||| markus|||test2||| ). Wo liegt der Fehler ? Ich häng bei dem Problem jetzt schon den ganzen Tag =(

while (<DATA>)  {
  ($name, $text) = split(/|||/);
  $daten{$name} = $text;
  }
 foreach $key (keys %daten)  {
   print "$key, $daten{$key}\n";
     }

falls das irgendwie nützlich ist: So sieht die Eingabe aus:

open(DATA,">>$data") or die "Can't save data: $!\n";
 flock DATA, 2;
 print DATA "$name|||$text||| \n";
 close DATA;

  1. hi!

    und zwar : Ich habe ein Flat File, auf dem Daten gespeichert
    werden, die über ein Formular eingegeben wurden und mit |||
    voneinander getrennt sind.
    while (<DATA>)  {
      ($name, $text) = split(/|||/);

    ^^^
    Die |-Zeichen sind Sonderzeichen in regulären Ausdrücken, die zur
    Angabe von Alternativen dienen. Vermutlich musst du die hier einfach
    nur maskieren:
      ($name, $text) = split(/|||/);

    Der Rest sieht ganz ok aus.

    bye, Frank!

    1. Hallo,

      hey danke, das hat geholfen. Leider hat sich da jetzt wieder ein anderes Problem aufgetan. Es funktioniert alles, bis ich bei der Texteingabe Enter drücke und in 2 oder 3 Zeilen schreib. Dann verwechselt er nämlich Name mit Text usw und ich bekomm ganz seltsame Ausgaben. Ich hab geglaubt das es mit die 3 Begrenzer funktioniert, da er doch bis zum nächsten Begrenzer ALLE Zeichen liest und wieder splittet, somit doch auch Leerzeichen und Zeilenumbrüche ? Wahrscheinlich is es doch nicht so.
      Ich habs vorher mit Erfolg anders probiert, indem ich bei der open >> Schreibeingabe ein ganzes HTML tag speicherte, aber das kann doch auch keine Dauerlösung sein.
      Wie kann ich jetzt den Zeilenumbruch verhindern, oder das Problem sonst irgendwie lösen ? Ich dachte dabei irgendwie an den 'chomp' Befehl aber wie und wo könnte ich diesen hier einsetzen ?

      1. hi!

        hey danke, das hat geholfen. Leider hat sich da jetzt wieder ein
        anderes Problem aufgetan. Es funktioniert alles, bis ich bei der
        Texteingabe Enter drücke und in 2 oder 3 Zeilen schreib. Dann
        verwechselt er nämlich Name mit Text usw und ich bekomm ganz
        seltsame Ausgaben. Ich hab geglaubt das es mit die 3 Begrenzer
        funktioniert, da er doch bis zum nächsten Begrenzer ALLE Zeichen
        liest und wieder splittet, somit doch auch Leerzeichen und
        Zeilenumbrüche ?

        Nein, du hast doch while (<DATA>) oder so ähnlich verwendet. Damit
        liest er immer nur eine einzige Zeile ein, also alles bis zum
        Zeilenumbruch. Wenn mitten in deinem Text Zeilenumbrüche vorkommen,
        dann kann es nicht mehr funktionieren.

        Am einfachsten wäre es wohl, wenn du entweder beim Speichern die
        Zeilenumbrüche ersetzt durch irgendwelche Sonderzeichen (wenn du
        HTML ausgibst, könntest du \n zb. gleich durch <br> ersetzen) oder
        am Anfang alles, was in der Datei steht, in einen Skalar einliest,
        den du dann mit deinen Regeln splitten kannst.

        Alternativ könntest du die Perl-Spezialvariable $/ ersetzen, die
        angibt, bis zu welchem Trennzeichen <DATA> aus einer Datei liest.
        Standardmäßig ist das \n, also das Newline-Zeichen.

        bye, Frank!