如何根据行号(而非字节)更改文件句柄中指针的位置?
我想将第一行设置为开始读取文件。这样做的正确方法是什么?
答案 0 :(得分:8)
设置文件指针不是自己的目的。如果您想阅读某一行,请使用Tie::File。
use Tie::File qw();
tie my @file, 'Tie::File', 'thefilename' or die $!;
print $file[2] # 3rd line
答案 1 :(得分:4)
使用tell
和seek
来读取和写入文件中每行的位置。这是一个可能的解决方案,需要您传递整个文件,但不要求您立即将整个文件加载到内存中:
# make a pass through the whole file to get the position of each line
my @pos = (0); # first line begins at byte 0
open my $fh, '<', $the_file;
while (<$fh>) {
push @pos, tell($fh);
}
# don't close($fh)
# now use seek to move to the position you want
$line5 = do { seek $fh,$pos[4],0; <$fh> };
$second_to_last_line = do { seek $fh,$pos[-3],0; <$fh> };