我正在尝试创建一个输出文件最后两行的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;
我必须改变什么以便脚本读取最后两行而不是前两行?
答案 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::File
或File::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;