Es wird nur die erste Zeile einer Textdatei ausgelesen.
Siechfred
- perl
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 Ö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
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
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
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