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. | [reply] [d/l] [select] |
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 :-))
| [reply] [d/l] [select] |
Re: skipping the first line of a file
by Utilitarian (Vicar) on Jun 12, 2009 at 13:52 UTC
|
perl -e 'while(<>){print if ($.>1);}' filename
| [reply] [d/l] |
Re: skipping the first line of a file
by toolic (Bishop) on Jun 12, 2009 at 16:44 UTC
|
| [reply] |
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.
Update: Fixed typo.
Update 2: ikegami has pointed out that this code is invalid and explained why so don't do this. | [reply] [d/l] |
|
| [reply] [d/l] [select] |
|
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.
| [reply] [d/l] [select] |
|
|
|
#!/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). | [reply] [d/l] |
|
|
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
| [reply] [d/l] [select] |
|
| [reply] [d/l] |