Siechfred: Es wird nur die erste Zeile einer Textdatei ausgelesen.

N'abend Forum,

ich habe eine kleine Textdatei mit folgendem Aufbau:

Z1: Datum1§§Thema1§§Inhalt
Z2: Datum2§§Thema1§§Inhalt
...

wobei "§§" der Separator ist.

Nun habe ich eine Subroutine, in welcher diese Datei ausgelesen wird:

sub get_data
{
  unless(open(DATA, "<".$data_file))
  {
    my $msg = "Beim &Ouml;ffnen der Datei ist folgender Fehler aufgetreten:<br>".$!;
    errorwin($msg);
  }
  flock(DATA, 1);
  my @lines = <DATA>;
  flock(DATA, 8);
  close(DATA);
  chomp(@lines);
  return @lines;
}

Im Ergebnis sollten eigentlich im Array @lines sämtliche Zeilen der o.g. Textdatei stehen. Mit return gebe ich diesen Array zurück.

Nun sollen die Daten ausgegeben werden:

sub show_all
{
  my $n = 0;
  my @beschluss = get_data();
  print_header("Liste aller Beschlüsse seit dem 01.03.2002");
  foreach(@beschluss)
  {
    my @this_line = split(/\§\§/, @beschluss[$n]);
    print "<p class='textbody'>Beschluss vom $this_line[0]<br>Thema: $this_line[1]</p>\n";
    print "<p class='textbody'>$this_line[2]</p>\n";
    $n++;
  }
  print "</td></tr></table></body></html>\n";
}

Sieht auch ganz gut aus, wenn ich die Seite aber aufrufe, gibt das Script nur den Inhalt von @beschluss[0] aus, obwohl es insgesamt 27 sein müssten. Hat jemand eine Ahnung, woran das liegen könnte?

mfg Siech*ratlos*fred

--

ss:| zu:| ls:# fo:| de:[ va:| ch:? n4:& rl:? br:& js:| ie:% fl:( mo:}
  1. Hallo,

    unless(open(DATA, "<".$data_file))

    unless(open(DATA, "<$data_file"))  # Auf den . kannst du verzichten

    flock(DATA, 8);                    # Auf ein unlock vor dem close ebenfalls

    Im Ergebnis sollten eigentlich im Array @lines sämtliche Zeilen der o.g. Textdatei stehen. Mit return gebe ich diesen Array zurück.

    Sollten ist in obigem Satz fehl am Platz. Solche Sachen kannst du mit Data::Dumper überprüfen.

    foreach(@beschluss)
      {
        my @this_line = split(/\§\§/, @beschluss[$n]);
        print "<p class='textbody'>Beschluss vom $this_line[0]<br>Thema: $this_line[1]</p>\n";
        print "<p class='textbody'>$this_line[2]</p>\n";
        $n++;
      }

    Versuch es doch mal, indem du deine for Schleife so verwendest wie sie gedacht sit:

    for (@beschluss) {
      my @this_line = split /\§\§/;
      print ...
    }

    Wenn du deine eigene $n Zählerei weglässt, dann hast du schon mal eine mögliche Fehlerquelle ausgescholossen.

    Viele Grüße,

    Stefan

  2. Hallo Siechfred,

    my @this_line = split(/\§\§/, @beschluss[$n]);

    kleiner Fehler: Wenn du auf ein Element eines Arrays zugreifen möchtest muss es
    $beschluss[$n]
    heißen. Ist ja auch logisch: Ein Element eines Arrays bei Perl ist immer ein Skalar.

    Eleganter [tm] ist es aber, wenn du - wie von Stefan vorgeschlagen - die Schleife umbaust.

    Grüße,

    Peter

  3. Hallo Peter & Stefan,

    vielen Dank, der Fehler lag in der Textdatei. Habe trotzdem eure Hinweise umgesetzt, bin aber bzgl. der Schleife beim foreach geblieben (lt. SelfHTML speziell für den Durchlauf von Arrays gedacht).

    mfg Siechfred

    --

    ss:| zu:| ls:# fo:| de:[ va:| ch:? n4:& rl:? br:& js:| ie:% fl:( mo:}