#!/usr/bin/perl -w use strict; use warnings; my $m_1 = "Receive message"; @ARGV == 2 || die "usage: $0 TAB_1 TAB_5\n"; my ( $TAB_11, $TAB_35 ) = @ARGV; my @files = <./*.log>; # Fixed inconsistent indentation. foreach my $file (@files) { print $file . "\n"; my @last_few_lines; my $how_many_lines = 3; my $matched = 0; open (my $HAN, $file) || die "Cannot open '$log' because: $!"; while ( (not $matched) && <$HAN> ) { # As per roboticus, slightly altered though: push @last_few_lines, $_; shift @last_few_lines if @last_few_lines > $how_many_lines; if ( m/$TAB_11|$TAB_35/ && m/$m_1/) { print @last_few_lines, $&; # Note that $& will contain the matched results from the # m/$m_1/ match, in your and my designs both. $matched = 1; } if ($matched) { $matched = 0; for (1..$how_many_lines) { print <$HAN>; last if eof $HAN; } } } }