Die print's und das sleep sind nur zum debuggen gedacht...
Was läuft also schief, warum wird nach zehn Zeilen nicht abgebrochen?
Also, was passiert?
Die Datei wird geöffnet, ein Zähler wird initialisiert. Per while wird die Datei zeilenweise eingelesen, einem Array @array zugeordnet, der Zähler erhöht, und wenn der Zähler kleiner 10 ist (0-9 sind ja zehn Zeilen) dann wird per next die nächste Zeile eingelesen. So weit, so richtig, so gut!
Aber was passiert, wenn der Zähler auf => 10 steht?
Dann wird nicht per next die nächste Zeile eingelesen. Allerdings kommt hinter dem next ja gleich die abschließende Klammer des While-Befehles, was Perl so interpretiert, daß die Schleife weiter durchlaufen wird. Also wird nicht per next die nächste Zeile geholt, sondern durch das while, da ja noch Zeilen zum Einlesen da sind. Das while liest ja so lange ein, so lange noch was da ist, was eingelesen werden kann...
Was tun?
Naja, zwei Möglichkeiten, erst die Unsauberere:
open (my $IN, "<$filename"); my @array=(); my $cou=0;
Es wird per last; explizit angegeben, daß, falls nicht per next die nächste Zeile angefordert wird, die aktuelle Zeile die Letzte war. Oder die bessere Lösung (zumindest meiner Meinung nach...):
die while-Schleife automatisch abgebrochen, wenn der Dateizeilen-Zähler $. (siehe hier und hier) auf 10 steht. Eine separater Counter ($cou) ist aber auch nicht schlecht, nur in dem Fall nicht nötig...
Eines vielleicht noch:
Beim Öffnen der Datei sollte man die Schreibweise
anwenden. Siehe diesen Artikel.
Ich hoffe, ich konnte das das Problem des Lesers anschaulich verdeutlichen und konnte ihm weiterhelfen. Und noch nen schönen Gruß in die Schweiz!
Kommentare zum Beitrag "Bestimmte Anzahl von Zeilen aus Datei einlesen - Probleme eines Lesers"
Kommentar von Renée Bäcker
Wie wär's mit
#!/usr/bin/perl
use strict;
use warnings;
my $file = '/pfad/zur/datei';
my @lines;
open my $fh, '<', $file or die $!;
while( my $line = <$fh> ){
push @lines, $line;
last if $. == 10;
}
close $fh;
print $_,"\n" for @lines;
*) Warum eine Zuweisung machen, wenn man "push" verwenden kann?
*) open sollte in der 3-Arg-Form verwendet werden, Deinen '.' also in ein ',' ändern. Mehr dazu in perldoc perlsec
*) Fehler sollten abgefangen werden...
*) in einer while-Schleife sollte man nicht $_ verwenden, da das das "globale" $_ überschreibt. Siehe
#!/usr/bin/perl
use strict;
use warnings;
my $file = '/pfad/zur/datei';
$_ = 'Dies ist ein Test';
open my $fh, '<', $file or die $!;
while( <$fh> ){
last if $. == 10;
}
close $fh;
print $_;
Kommentar von Urs Müller
Cool, danke für die Tipps.
Die ganze Input-Datei will ich sowieso nicht einlesen. Der Input ist Postscript-Code und die Dateien können wirklich gross ein.