阅读最后两行,而不是Perl中的前两行

时间:2014-08-30 03:31:34

标签: perl

我正在尝试创建一个输出文件最后两行的Perl脚本。我当前的脚本完成了我想要的,除了它读取前两行而不是后两行。

use strict;
use warnings;

my $file = 'test.txt';
open my $info, $file or die "Could not open $file: $!";

while( my $line = <$info>)  {   
    print $line;    
    last if $. == 2;
}

close $info;

我必须改变什么以便脚本读取最后两行而不是前两行?

2 个答案:

答案 0 :(得分:15)

这比打印第一行更难!以下是一些选项,从最不聪明到最聪明:

只需使用tail

即可

因为谁真的需要一个perl脚本来打印文件的最后两行?

将文件中的所有行读入列表,然后打印最后两行。

print do {
    open my $info, $file or die ...;
    (<$info>)[-2, -1];
};

从文件中读取所有行,只记住最后两行。

open my $info, $file or die ...;
my @lines;
while (my $line = <$info>) {
  shift @lines if @lines == 2;
  push @lines, $line;
}
print @lines;

向后阅读文件,寻找行尾;当找到两个时,从那一点开始向前阅读。

这是最节省内存的,特别是如果&#34; line&#34;令人担忧的是,但很复杂。但是,它有一个模块:File::ReadBackwards。它可以让你:

use File::ReadBackwards;
my $info = File::ReadBackwards->new($file) or die ...;
my $last = $info->readline;
my $second_last = $info->readline;
print $second_last, $last;

答案 1 :(得分:1)

您可以使用Tie::FileFile::ReadBackwards

代码看起来像这样。

使用Tie::File

use strict;
use warnings;

use Tie::File;

my $file = 'test.txt';

tie my @file, 'Tie::File', $file or die $!;

print "\nUsing Tie::File\n";
print "$_\n" for @file[-2,-1];

使用File::Readbackwards

use strict;
use warnings;

use File::Readbackwards;

my $file = 'test.txt';

my $backwards = File::ReadBackwards->new($file) or die $!;

my @last_two;
while (defined(my $line = $backwards->readline)) {
   unshift @last_two, $line;
   last if @last_two >= 2;
}

print "\nUsing File::ReadBackwards\n";
print @last_two;