Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked

Re: skipping the first line of a file

by johngg (Abbot)
on Jun 12, 2009 at 20:55 UTC ( #771095=note: print w/replies, xml ) Need Help??

in reply to skipping the first line of a file

Skipping the header in a for loop (implied with a statement modifier) is quite flexible as you can skip one, two or many lines with equal facility. It also has the advantage that the scalar receiving the readline only exists within the loop.

my $discard = <$fh> for 1 .. 1; # $discard no longer in scope here.

I hope this is of interest.



Update: Fixed typo.

Update 2: ikegami has pointed out that this code is invalid and explained why so don't do this.

Replies are listed 'Best First'.
Re^2: skipping the first line of a file
by ikegami (Pope) on Jun 12, 2009 at 21:55 UTC

    my ... for ...; is not valid Perl. { my $discard = <$fh>; } would do, but there's no reason to give the line to any scalar.

      my ... for ...; is not valid Perl.

      Well, it seems to compile and run with no warnings or errors.

      use strict; use warnings; my $discard = <DATA> for 1 .. 2; print while <DATA>; __END__ Header 1 Header 2 Data 1 Data 2 Data 3
      $ ./spw770971 Data 1 Data 2 Data 3 $

      Please could you explain in what way it is not valid.



        Because the docs says it isn't.

        The behaviour of a my statement modified with a statement modifier conditional or loop construct (e.g. my $x if ... ) is undefined. The value of the my variable may be undef, any previously assigned value, or possibly anything else. Don't rely on it. Future versions of perl might do something different from the version of perl you try it out on. Here be dragons.

        ( EmphasisStrong emphasis in original. )

        That said, the current behaviour is actually quite predictable, and it doesn't limit $discard to the loop

        >perl -cwe"use strict; my $x for 1..2; print $x" -e syntax OK

        So not only is not valid Perl, it doesn't even work.

      Hmmmm. Thought I was going to agree with ikegami (or, at least ++ the parent)...
      but for some unknown reason, decided to check (with a little elaboration)... and got this surprise:

      #!/usr/bin/perl use strict; use warnings; # from thread 770979 my $discard ="|"; $discard .= <DATA> for 1 .. 2; print " " . "-" x19 . "\n \$discard: $discard\n" ." " . "-" x19 . "\n" +; print while <DATA>; =head OUTPUT: ------------------- $discard: |Header 1 Header 2 ------------------- Data 1 Data 2 Data 3 =cut __END__ Header 1 Header 2 Data 1 Data 2 Data 3

      Now, yes, for real-world tasks, there's no need to stick the skipped lines into a $var, but johngg's reply to citromatik reflects a mindset I frequently favor, too, when responding to what appears to be either a newbie question or one that could have been answered with a bit of searching (i.e." ?node_id=3989;BIT=skip%2C%20first%20line%2C%20file;BIS=%20%2C).

        I didn't say it didn't work, I said it wasn't valid.

        Although I've since shown that it also doesn't work.

Re^2: skipping the first line of a file
by citromatik (Curate) on Jun 12, 2009 at 21:45 UTC
    my $discard = <$fh> for 1 .. 1; # $discard no longer in scope here.

    I don't get the point, in what sense is your example better than this?



    <$fh> for 0..2;

    The diamond operator doesn't use $_ as default, so using it in "void" context silently reads the next line of the filehandle


      silently reads the next line

      I use $discard to make it more obvious that the return value of the readline is being thrown away.



Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://771095]
[stevieb]: Date::Time even
[stevieb]: ffs I can't make DateTime link properly, so there.
[atcroft]: .oO(It is a well-known, well-tried module that has probably encountered more corner-cases and oddities than the average mortal programmer can imagine when trying to roll their own...)
[atcroft]: .oO(*Blah* It, I meant....)
[james28909]: omg

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (3)
As of 2017-04-29 04:19 GMT
Find Nodes?
    Voting Booth?
    I'm a fool:

    Results (531 votes). Check out past polls.