fraktalisman has asked for the wisdom of the Perl Monks concerning the following question:

The piece of code below is supposed to read 20 lines of an existing text file and set a mark ($marke) so the next time this piece of code gets executed, it would then skip the first $marke lines.

When $marke is still zero, everything goes as planned. Oddly, in the second run when $marke is 21, the file is not read line-by-line like it was in the first run, but the whole file goes into the $zeile string. Why?

The documentation and tutorials don't cover this problem. Is there something like line context (not exactly) that I could force my filehandle into?

open(TODO,"<datei.txt") or &fehler; while ($zeile=<TODO>) { print "$counter $zeile\n"; # debugging: what is actually read? chomp $zeile; next if ($counter<$marke); if ($counter>($marke+20)) { $stilltodo=1; last; } push (@liste,$zeile); $counter++; } close(TODO);
Update: corrected "line contest" to "line context". Problem is solved now, see below.

Replies are listed 'Best First'.
Re: filehandle not returning lines
by Hena (Friar) on Feb 18, 2005 at 10:57 UTC
    Note that your adding to counter is after a next in the while loop. This probably means that your counter will not work properly. You probably want to put $counter++ first in while loop (or in continue block after while.
      Oooops! Bad mistake! And that's already the solution.
      No mysterious context bug or anything like that.
      Thanks a lot! Question answered.

Re: filehandle not returning lines
by borisz (Canon) on Feb 18, 2005 at 10:48 UTC
    if your whole file is read at once, it is most likely that some part of your program modify the $/ var. $/ The input record separator, newline by default.
    Read the whole story with perldoc perlvar
    Boris
      Thanks for the idea. But I have just double checked the whole script if it accidentally messes with $/ but it doesn't.
      The same code is behaving as it should as long as the mark $marke==0, but this makes no sense to me.