my @lines = 1 .. 20; my @interesting = ( 1, 3, 6, 10 , 20 ); my $padding = 2; my $bufsize = 2 * $padding + 1; my $viewline = $padding; my @buf = ('') x $bufsize; while ( @buf > 0 ) { my $line = shift @lines; # get some data shift @buf; # shorten buffer push @buf, $line # add new line if $line; # if there was one print "-->@buf\n" # if there's something to see && it's interesting if $buf[$viewline] && grep $buf[$viewline] eq $_, @interesting; } #### --> 1 2 3 -->1 2 3 4 5 -->4 5 6 7 8 -->8 9 10 11 12 -->18 19 20