I am trying to create a Perl script that outputs the last two lines of a file. My current script accomplishes what I want, except that it reads the first two lines rather than the last two.
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;
What must I alter so that the script reads the last two lines rather than the first two?
This is harder than printing the first lines! Here are a few options, ranging from least to most clever:
tail
Because who actually needs a perl script to print the last two lines of a file?
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;
This is the most memory efficient, especially if a "line" is worryingly long, but complicated. However, there's a module for it: File::ReadBackwards. It lets you do:
use File::ReadBackwards;
my $info = File::ReadBackwards->new($file) or die ...;
my $last = $info->readline;
my $second_last = $info->readline;
print $second_last, $last;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With