哪个是在perl中读取或写入文件中特定行的最佳方法?

时间:2016-08-04 12:24:59

标签: perl file

我正在尝试阅读该文件的最后一行。 并且有许多方法可用于读取特定的文件行。

第一

  @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这是更好的方法,是否使用包 或将整个文件内容存储到变量中。

2 个答案:

答案 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";