Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical

Re^2: get n lines before or after a pattern

by johngg (Abbot)
on Jul 25, 2012 at 23:54 UTC ( #983752=note: print w/replies, xml ) Need Help??

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.



Replies are listed 'Best First'.
Re^3: get n lines before or after a pattern
by Kenosis (Priest) on Jul 26, 2012 at 03:41 UTC

    This is of interest, and excellent, too, JohnGG!

    I was aware that I didn't confine the local $/; to a block, not thinking too much about the code snippet. However, I'll remember--as a best practice--to do so with future local (dynamically scoped) variables. It was good to point this out.

    I like your refined/seasoned coding: scoping, reading in a multi-line record, opening a file handle on the record-containing scalar, and then grepping through the lines to display the OP's desired output.

    Indeed, this is of interest, very well thought out, and very much appreciated.

    Thank you.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://983752]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (5)
As of 2018-06-22 23:15 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (124 votes). Check out past polls.