You can set the input record separator ($/) to ) and input your data a block at a time. Resetting the separator inside the chunk reading loop reuses the same trick to parse the lines. Consider:
use strict; use warnings; my $data = <<DATA; (CSW - Q1) OMIPMS55:NTTCSWQ1:MQSI.3PL846 OMIPMS55:NTTCSWQ1:MQSI.STATUS OMIPMS55:NTTCSWQ1:MQSI.3PLXDOCK.STATE (CSW - Q2) OMIPMS55:NTTCSWQ2:MQSI.3PL846 OMIPMS55:NTTCSWQ2:MQSI.3PL944 (CSW - Q3) OMIPMS55:NTTCSWQ3:MQSI.3PL846 DATA local $/ = ')'; open IN, '<', \$data; while (defined (my $chunk = <IN>)) { chomp $chunk; local $/ = "\n"; open LINES, '<', \$chunk; my @lines = <LINES>; close LINES; pop @lines if $lines[-1] =~ '\('; print @lines; } close IN;
Prints:
OMIPMS55:NTTCSWQ1:MQSI.3PL846 OMIPMS55:NTTCSWQ1:MQSI.STATUS OMIPMS55:NTTCSWQ1:MQSI.3PLXDOCK.STATE OMIPMS55:NTTCSWQ2:MQSI.3PL846 OMIPMS55:NTTCSWQ2:MQSI.3PL944 OMIPMS55:NTTCSWQ3:MQSI.3PL846
In reply to Re: matching some lines
by GrandFather
in thread matching some lines
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |