我正在尝试阅读该文件的最后一行。 并且有许多方法可用于读取特定的文件行。
第一
@array=<FILE_HANDLE>;
$line=(reverse @array)[0];
第二名:ReadBackwards包
$bw = File::ReadBackwards->new( 'log_file' ) or
die "can't read 'log_file' $!" ;
$log_line = $bw->readline;
我想知道在perl这是更好的方法,是否使用包 或将整个文件内容存储到变量中。
答案 0 :(得分:4)
你的标题问题与你的身体不同。
要读取任意大文件中的最后一行(或最后一行),绝对要使用File :: ReadBackwards。
要在文件中读取或写入任意一行,请使用Tie :: File:
use Tie::File;
tie my @line, 'Tie::File', 'filename' or die "unable to open filename: $!";
print "line 123 is $line[123].";
$line[42] = 'abc';
print "line 42 is now abc.";
对于大文件,这将比File :: ReadBackwards昂贵得多,因为它需要读取整个文件直到您要修改的行(或者通过整个文件,如果使用负索引,所以如果你这样做,你最好使用File :: ReadBackwards,然后手动更新文件。)
答案 1 :(得分:-2)
事情是 - 没有一种方法不依赖于阅读整个文件。文件从头开始,您的进程将必须一直寻找。 这是您的代码将要执行的最昂贵的任务,因此您采用的方法几乎没有什么区别。
所以我想说的很简单:
my $last_line;
while ( my $line = <$filehandle> ) { $last_line = $line };
print $last_line,"\n";
这可能看起来效率低下,但它只是做其他事情 - 读取整个文件,丢弃除最后一行之外的所有内容。
如果 - 正如你的问题所暗示的那样 - 你是在一个特定的线之后 - 你可以使用测试$.
(当前行号)或正则表达式,并在条件时'拯救'循环满足了。因此,您不会读取整个文件,这会稍微提高效率。
E.g:
while ( my $line = <$filehandle> ) {
$last_line = $line;
last if $. >= 100; #bails out after we hit line 100.
last if m/END FILE/; #looks for 'END FILE' on the line, and bails out.
};
print $last_line,"\n";