http://qs321.pair.com?node_id=748843


in reply to Re: Hmmm: while(), file handle and $_ gotcha
in thread Hmmm: while(), file handle and $_ gotcha

moritz:

OK, that explains it. (I had an incorrect mental model: I was thinking that <FH> always put the data somewhere, using $_ unless otherwise specified. I don't know how I came to think that, as in hindsight that would be clearly stupid. Oh, well--live and learn!)

So the correct fix to my program would is to change the inner loop from:

for my $cnt (0 .. 3) { my $t=<DATA>; print $t; }

to

for my $cnt (0 .. 3) { $_=<DATA>; print; }

so I can avoid unnecessary variables and clutter.

Thank you!

...roboticus

Replies are listed 'Best First'.
Re^3: Hmmm: while(), file handle and $_ gotcha
by ikegami (Patriarch) on Mar 06, 2009 at 13:55 UTC
    or
    for my $cnt (0 .. 3) { print scalar(<DATA>); }

      Cool! And then perhaps:

      while (<DATA>) { if ($. % 10 == 1) { print; print scalar(<DATA>) for(0..3); } }
        Since we want to print the first 5 lines of each group of 10,
        while (<DATA>) { print if ($. - 1) % 10 < 5; }
Re^3: Hmmm: while(), file handle and $_ gotcha
by webfiend (Vicar) on Mar 06, 2009 at 17:40 UTC

    Hold up. How does one variable - two, if you did what I do and use a variable for the outer read as well - equate to clutter? I'd probably remove the unused $cnt if I was going to knock clutter out.

    use Modern::Perl; while (my $line = <DATA>) { if ( $. % 10 == 1 ) { print $line; } for (0 .. 3) { my $important_line = <DATA>; print $important_line; } }

    I realize this is a matter of personal aesthetics, of course. I was just a little confused how declaring and using a variable (and avoiding weird behavior from <DATA>) was better than declaring an unused variable and getting the weird behavior.

      Using a variable is even required if you want to add error checking.

      while (my $line = <DATA>) { if ( $. % 10 == 1 ) { print $line; } for (0 .. 3) { defined( my $important_line = <DATA> ) or die("Premature EOF\n"); print $important_line; } }

        For small values of "required".

        print( scalar <DATA> // die "Premature EOF\n" );

        (But don't do that, because the version with the explicit variable is obviously right, whereas the version without one forces the reader to pause and wonder whether it will work or not. So it is, I suppose, required in the sense of "required by any sane coding standards" ...)