#!/usr/bin/perl use strict; use warnings; my $file = $0; # FIXME to your filename my $backward = tybalt89sreadbackward( $file ); # create iterator while( defined( $_ = $backward->() ) ) # USAGE: read each line { print; # NOTE or whatever you want to do } sub tybalt89sreadbackward # iterator version { my $filename = shift; my $size = shift // 4096; my ($text, @lines) = ''; open my $fh, '<', $filename or die "$! opening $filename"; my $chunk = int +($size - 1 + -s $fh) / $size; return sub { while( @lines == 0 and $chunk-- > 0 ) { seek $fh, $chunk * $size, 0 or die "$! on seek"; $text = do { local $/ = \$size; <$fh> . $text }; $text =~ s/(?<=\n).+/ @lines = split '^', $&; '' /es; } return pop @lines // ($text =~ s/.+//s ? $& : undef); } }