On Oct 23, Shannon Murdoch said:
>I've been using the while(<FILEHANDLE>){ command, but it's not very helpful
>when I need something on line #15 or something.
>
>Is there any function like $linecontents = line(FILEHANDLE,15); ?
Make your own. The concept uses a positional hash. The hash looks like
this:
%pos = (
FILEHANDLE => [
0, # offset of line 1
24, # offset of line 2
70, # offset of line 3
],
);
You'll see how this comes into play in a moment.
my %pos;
sub line {
my ($fh, $line) = @_;
# if we've worked with this filehandle before...
if ($pos{$fh}) {
# if we haven't recorded this line's position yet...
while (@{ $pos{$fh} } < $line) {
# go to the farthest line we've seen
seek $fh, $pos{$fh}[-1], 0;
# read a line
<$fh>;
# and push the position
push @{ $pos{$fh} }, tell $fh;
}
# in any case, now position ourselves at the start of the line
seek $fh, $pos{$fh}{$line-1}, 0;
}
# if we haven't seen this filehandle before...
else {
# go to the beginning of the file
seek $fh, 0, 0;
# line 1 has offset of 0
push @{ $pos{$fh} }, tell $fh;
# until we get to the line requested...
for (2 .. $line) {
# read a line
<$fh>;
# and push the position
push @{ $pos{$fh} }, tell $fh;
}
}
}
This code is used like so:
open FILE, "< /path/to/file" or die "can't read /path/to/file: $!";
line(\*FILE, 10);
$line_10 = <FILE>;
close FILE;
This process is relatively efficient.
--
Jeff "japhy" Pinyan [EMAIL PROTECTED] http://www.pobox.com/~japhy/
RPI Acacia brother #734 http://www.perlmonks.org/ http://www.cpan.org/
** Look for "Regular Expressions in Perl" published by Manning, in 2002 **
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]