my $MAX = 5; local $_; OUT: while ( defined ( $_ = ) ){ push @lines, $_; shift @lines if @lines > $MAX; if ( /bla bla/ ) { print @lines, $_; for ( 1 .. $MAX ) { last OUT unless defined ( $_ = ); print; } } }