嗨我有一个想要阅读的大文件。为了节省资源,我想慢慢读取它,一次一行。但是,我想知道是否有办法从文件句柄中读取特定行。例如,假设我有一个test.txt文件,其中包含以1开头的十亿个数字。每个数字都在一个单独的行上。
1
2
3
...
所以现在我要做的就是说第10行就是这个,
open (FILE, "< test.txt") or die "$!";
@reads = <FILE>
print $reads[9];
然而,有没有办法可以访问文件的某些部分,而不会将所有内容都读成大数组,比如说我想要第10行。
something like FILE->[9]
- 谢谢你提前帮忙!
答案 0 :(得分:1)
出于内存目的,应使用while循环读取大文件,该循环将逐行读取文件:
open my $fh, '<', 'somefile.txt';
while ( my $line = <$fh> ) {
//read in text line by line
}
无论哪种方式获得该行号,您都必须阅读整个文件。现在我建议使用while循环和计数器来打印/保存您要查找的行。
答案 1 :(得分:1)
两种方法,逐行处理您的跳过到所需的行。您可以使用输入行号变量$.
来帮助:
use strict;
use warnings;
use autodie;
my $line10 = sub {
open my $fh, '<', 'text.txt';
while (<$fh>) {
return $_ if $. == 10;
}
}->();
或者,您可以使用Tie::File
,因为您已经注意到了。然而,虽然该界面非常方便,并且我建议使用它,但它也会在幕后循环播放文件。
use strict;
use warnings;
use autodie;
use Tie::File;
tie my @array, 'Tie::File', 'text.txt' or die "Can't open text.txt: $!";
print $array[9] // die "Line 10 does not exist";