Carl der Eine: Wird Zeilenabschlusszeichen \n mit eingelesen?

Einen Datensatz speichere ich wie folgt in eine Textdatei:

open(FileNr, ">$DateiName") || die "Fehler: $!";
  $Datensatz = $Feld1.chr(9). $Feld2."\n";
  print FileNr $Datensatz;
  close FileNr;

Die Felder werden durch den Zeichenwert 9 mit chr(9) separiert.
Dann lese ich den, oder die Datensätze wie folgt:

my @Datenfelder = ();
  open(FileNr, "<$DateiName") || die "Fehler: $!";
  my @Datensaetze = (<FileNr>);
  close(FileNr);

foreach my $Datensatz (@Datensaetze) {
    @Datenfelder=split(chr(9),$Datensatz);
    &Verarbeiten
  }

Die Felder werden mit dem Zeichenwert 9 durch chr(9) gesplittet.
Da es sich hierbei um zwei Felder pro Zeile, bzw. Datensatz handelt steht im Feld $Datenfelder[1], also im zweiten Feld als letztes Zeichen der Zeichenwert 10 der mit ord(substr($Datenfelder[1], length($Datenfelder[1]-1), 1)) als Test von mir ausgegeben wird. Ich dachte, das Zeilenabschlusszeichen \n wird nicht mit eingelesen. Anscheinend doch?

  1. Tach auch.

    Die Felder werden mit dem Zeichenwert 9 durch chr(9) gesplittet.
    Da es sich hierbei um zwei Felder pro Zeile, bzw. Datensatz handelt steht im Feld $Datenfelder[1], also im zweiten Feld als letztes Zeichen der Zeichenwert 10 der mit ord(substr($Datenfelder[1], length($Datenfelder[1]-1), 1)) als Test von mir ausgegeben wird. Ich dachte, das Zeilenabschlusszeichen \n wird nicht mit eingelesen. Anscheinend doch?

    Wird es, wie du es ja selber herausgefunden hast.

    Einfache Lösung ist etwas wie
    @array = map { chomp; } <FILE>;

    also jede Zeile zu chompen.

    (keine Gewähr, hab ewig kein Perl mehr programmiert :))

    Bis die Tage,
    Matti

  2. Hi,

    Da es sich hierbei um zwei Felder pro Zeile, bzw. Datensatz handelt steht im Feld $Datenfelder[1], also im zweiten Feld als letztes Zeichen der Zeichenwert 10 der mit ord(substr($Datenfelder[1], length($Datenfelder[1]-1), 1)) als Test von mir ausgegeben wird. Ich dachte, das Zeilenabschlusszeichen \n wird nicht mit eingelesen. Anscheinend doch?

    Ja, \n wird mit ausgelesen.
    Am einfachsten bekommst du es mit chomp() weg.

    mfG,
    steckl

  3. Nachdem dein eigentliches Problem geklärt ist, erlaube ich mir mal, deinen Code ein wenig zu kommentieren:

    Einen Datensatz speichere ich wie folgt in eine Textdatei:

    open(FileNr, ">$DateiName") || die "Fehler: $!";
      $Datensatz = $Feld1.chr(9). $Feld2."\n";
      print FileNr $Datensatz;
      close FileNr;

    Warum legst du die Variable $Datensatz an? Du kannst gleich in die Datei schreiben:

    print FileNr "$Feld1\t$Feld2\n";

    my @Datenfelder = ();
      open(FileNr, "<$DateiName") || die "Fehler: $!";
      my @Datensaetze = (<FileNr>);
      close(FileNr);

    foreach my $Datensatz (@Datensaetze) {
        @Datenfelder=split(chr(9),$Datensatz);
        &Verarbeiten
      }

    Das kannst du wunderbar bereits beim Einlesen der Daten in einem Rutsch erledigen:

    my @Daten;  
    open FH, "$DateiName" or die $!;  
    while(<FH>) {  
      chomp;  
      push @Daten, [ split /\t/ ];  
    }
    

    Schau dir hierzu den Abschnitt Arrays of Arrays in perldsc an. Daneben solltest du dir wirklich sicher sein, was du tust, wenn du eine Subroutine so aufrufst, wie in deinem Codebeispiel. Schau dir hierzu perlsub an.

    Aber das alles nur zur Ergänzung.

    Siechfred