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.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|