in reply to Parsing out mulitiple blocks of interesting data in files / ignoring other contents

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 = (); } } }
  • Comment on Re: Parsing out mulitiple blocks of interesting data in files / ignoring other contents
  • Select or Download Code