use strict; use warnings; use Tie::File; sub max ($$) { $_[$_[0] < $_[1]] } sub min ($$) { $_[$_[0] > $_[1]] } my $file_in = 'data.txt'; my @lines; tie @lines, 'Tie::File', $file_in or die "Unable to tie $file_in $!"; my $n_recs = @lines; # how many records are in the file? my @lnbrs = (); my $i = 0; while ($i < $n_recs - 1) { my $twolines = $lines[$i] . $lines[$i + 1]; if ($twolines =~ m/file\s+for\s+(?:bankrup|chapter)/im) { push @lnbrs, $i } $i++; } foreach my $ln (@lnbrs) { my $start = max($ln-3, 0); my $end = min ($ln+3, $n_recs); print '-' x 75, "\n"; foreach ($start .. $end) { print "$lines[$_]\n"; } } untie @lines;