http://qs1969.pair.com?node_id=771119


in reply to Re: skipping the first line of a file
in thread skipping the first line of a file

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

Replies are listed 'Best First'.
Re^3: skipping the first line of a file
by johngg (Canon) on Jun 12, 2009 at 22:39 UTC
    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.

    Cheers,

    JohnGG

      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.

        You learn something new every day. I'll remember not to do that in future but use a real loop instead.

        Thank you,

        JohnGG

Re^3: skipping the first line of a file: "s not valid Perl."
by ww (Archbishop) on Jun 13, 2009 at 03:17 UTC

    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.