Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

skipping the first line of a file

by Angharad (Pilgrim)
on Jun 12, 2009 at 13:47 UTC ( [id://770971]=perlquestion: print w/replies, xml ) Need Help??

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

Hi there

Is there a easy way to skip the first line of a file? I want to do some analysis on a text file but need to ignore the first line as its just headers and not actual information.

Any suggestions much appreciated!

Replies are listed 'Best First'.
Re: skipping the first line of a file
by Transient (Hermit) on Jun 12, 2009 at 13:50 UTC
    my $first_line = <DATA>; while (<DATA>) { ... }
    or
    while (<DATA>) { next if $. == 1; }
    Update: Forgot the obvious case. The first being preferred (imo) so as not to execute each iteration.
Re: skipping the first line of a file
by Bloodnok (Vicar) on Jun 12, 2009 at 15:13 UTC
    TIMTOWTDI ,

    The other suggestions thus far assume a line-by-line read of the file, if you're slurping the file in, howz about...

    my ($first, @rest) = <DATA>; warn "first: $first"; warn "rest:\n@rest"; __DATA__ header line1 line2
    user@unforgiven:~$ perl tst.pl first: header rest: line1 line2 user@unforgiven:~$
    A user level that continues to overstate my experience :-))
Re: skipping the first line of a file
by Utilitarian (Vicar) on Jun 12, 2009 at 13:52 UTC
    quick example
    perl -e 'while(<>){print if ($.>1);}' filename
Re: skipping the first line of a file
by toolic (Bishop) on Jun 12, 2009 at 16:44 UTC
Re: skipping the first line of a file
by johngg (Canon) on Jun 12, 2009 at 20:55 UTC

    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.

    Cheers,

    JohnGG

    Update: Fixed typo.

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

      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.

        Cheers,

        JohnGG

        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).

      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>;

      or

      <$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

      citromatik

        silently reads the next line

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

        Cheers,

        JohnGG

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://770971]
Approved by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others avoiding work at the Monastery: (4)
As of 2024-04-25 13:31 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found