FWIW, an explanation of why what you tried didn't work.
/^interface/../shutdown/ will see a line starting with "interface", so the left side of .. will "activate" that instance of .. which will evaluate as "true" until the right side matches a line containing "shutdown". And because the action for the associated if statement is next, all the lines will just be ignored.
Also, note that the $_ =~ is redundant in this case. A match without a binding operator (=~ or !~) implicitly matches against $_
Which leads to: If you were intending to match against a specific variable, you would need to write:
$line =~ /^interface/ .. $line =~ /!/
otherwise, the left side would match against $line while the right side would match against $_
One way (not tested) you might still use the scalar range operator (also known as "flip-flop"):
my @block; my $reject; while (<>) { if (/^interface/ .. /!/) { if (/shutdown/) { $reject = 1; @block = (); } if (not $reject) { unshift @block, $_; } } else { $reject = 0; if (@block > 0) { print @block; @block = (); } } }
In reply to Re: Parsing out mulitiple blocks of interesting data in files / ignoring other contents
by RonW
in thread Parsing out mulitiple blocks of interesting data in files / ignoring other contents
by GeorgMN
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |