in reply to Padding search results with context

I'd use a fixed size buffer @buf with $paddding * 2 + 1 elements and always look at the middle line ($viewline) of the buffer. @interesting is a list of thing you're interested in.

@lines contains the data. I've used a list of numbers, but it could be text.

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 interestin +g if $buf[$viewline] && grep $buf[$viewline] eq $_, @interesting; }

Output:

--> 1 2 3 -->1 2 3 4 5 -->4 5 6 7 8 -->8 9 10 11 12 -->18 19 20

update: added the output

Replies are listed 'Best First'.
Re^2: Padding search results with context
by moritz (Cardinal) on Aug 14, 2007 at 06:51 UTC
    Thank you for your reply.

    Sadly it uses a list from the first to the last index, which could be some thousand apart for only two @interesting items, so I'll pick one of the other very good solutions.