I slurp the data into a string then use regexen and @- & @+ to find the point just after the start marker and just before the end marker. I then use substr and join to replace the necessary text between the markers, working backwards from the right side of the string by sorting start marker position into descending order, greping away any incomplete marker events. ( Note that I have formed the habit of opening file handles against HEREDOCs rather than using the __DATA__ section as it allows me to use multiple data sources in scripts as necessary. )
use strict;
use warnings;
open my $inFH, q{<}, \ <<__EOD__ or die qq{open: < HEREDOC:$!\n};
aaa
AAAAAA
ccc
ddd
BBBBBB
EEEEEE
zzz
xxx
yyy
FFFFFF
111
GGGGGG
222
333
CCCCCC
444
555
666
DDDDDD
777
888
999
__EOD__
my $inText = do {
local $/;
<$inFH>;
};
close $inFH or die qq{close: < HEREDOC:$!\n};
my @events = (
{
start => qr{(?x) GGGGGG $/ },
stop => qr{(?x) HHHHHH $/ },
repl => [ qw{ f31 f32 f33 f34 } ],
},
{
start => qr{(?x) AAAAAA $/ },
stop => qr{(?x) BBBBBB $/ },
repl => [ qw{ f11 f12 f13 } ],
},
{
start => qr{(?x) EEEEEE $/ },
stop => qr{(?x) FFFFFF $/ },
repl => [ qw{ f31 f32 f33 f34 } ],
},
{
start => qr{(?x) CCCCCC $/ },
stop => qr{(?x) DDDDDD $/ },
repl => [ qw{ f21 f22 } ],
},
);
foreach my $rhEvent ( @events )
{
$rhEvent->{ startPos } =
$inText =~ $rhEvent->{ start }
? $+[ 0 ]
: -1;
$rhEvent->{ stopPos } =
$inText =~ $rhEvent->{ stop }
? $-[ 0 ]
: -1;
}
substr
$inText,
$_->{ startPos },
$_->{ stopPos } - $_->{ startPos },
join $/, q{}, @{ $_->{ repl } }, q{}
for
sort { $b->{ startPos } <=> $a->{ startPos } }
grep { $_->{ startPos } >= 0 && $_->{ stopPos } >= 0 }
@events;
print $inText;
The output.
aaa
AAAAAA
f11
f12
f13
BBBBBB
EEEEEE
f31
f32
f33
f34
FFFFFF
111
GGGGGG
222
333
CCCCCC
f21
f22
DDDDDD
777
888
999
I hope this is of interest.
Update: Corrected grep link.
-
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.