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



我正在尝试读取文件的最后一行。还有很多方法可以用来读取特定的文件行。

第一个:

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

你的标题提出的问题与你的身体不同。

要从任意大的文件中读取最后一行(或倒数第n行),请绝对使用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::read Backwards,然后手动更新文件)。

问题是,没有一种方法不依赖于读取整个文件。文件从一开始就开始,您的过程将必须一直查找。这是您的代码将要执行的最昂贵的任务,因此您所采取的方法几乎没有什么区别。

所以我会选择一个非常简单的:

 my $last_line; 
 while ( my $line = <$filehandle> ) { $last_line = $line }; 
 print $last_line,"n";

这看起来可能效率低下,但它只做了其他事情——读取整个文件,并丢弃除最后一行之外的所有内容。

如果——正如你的问题所暗示的那样——你在特定的一行之后——你可以使用测试$.(当前行号)或正则表达式,并在满足条件时"退出"循环。因此,您不会读取整个文件,这会稍微提高效率。

例如:

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

相关内容

  • 没有找到相关文章

最新更新