http://www.perlmonks.org?node_id=983752


in reply to Re: get n lines before or after a pattern
in thread get n lines before or after a pattern

Reading "records" rather than lines is a nice approach. One minor point, your local is not really local as you have not confined it to a particular scope so it applies from the point it appears until the end of the script.

Rather than the split and array slice, another approach could be to open a file handle against a reference to the record so that you can read it line by line in an inner scope and just print the lines you want. This has the advantage that the record layout can change and it will still work.

use strict; use warnings; open my $inFH, q{<}, \ <<EOD or die $!; start id 10 address Richmond name jack xxxxx aaaaa lastname black yyyy zzzzz id 11 address Central name rick cccccc dddddd lastname hanna eeeee yyyyy id 12 address denver name jack sssss tttttt lastname strong rrrrr mmmmm id 13 address Virginia name mick aaaaaaa ooooooo lastname jagger gggggg hhhhhh id 14 address Maine name rick sssss sssss lastname stewart ssssss ffffff end EOD { local $/ = q{id}; while ( my $record = <$inFH> ) { next unless $record =~ m{name\s+jack\b}; chomp $record; $record = $/ . $record; { local $/ = qq{\n}; print for do { open my $recordFH, q{<}, \ $record or die $!; grep { m{^(?:id|address|name|lastname)} } <$recordFH>; }; } } }

I hope this is of interest.

Cheers,

JohnGG