in reply to Matching between START and END revisited
Option 1 is to catch the return value of the range operator itself, which you now only use as a boolean.
(Precedence of "..." is higher than the assignment.)if(my $cnt = /^ policy-map $ouputpol/ ... / policy-map/) {
If you examine the contents of $cnt closely, you'll see it's a counter, with the numerical value 1 for the first line, 2 for the next... and as a string, it has a "E0" appended only for the very last line. So you can check it:
Note that that suffix doesn't change the value of the number, while it's still a valid representation of it.print unless $cnt==1 || $cnt =~ /E/;
The second approach is to catch the return value of the left and right hand sides individually:
Note the extra parens. Here, $first will be true for the first line, and $last will be true for the last one. No additional check is necessary.if(($my $first = /^ policy-map $ouputpol/) ... (my $last = / policy-ma +p/)) {
print unless $first || $last;
For the people who want a simple standalone test, without requiring something ressembling your data:
which prints:for my $i (1 .. 15) { if(my $cnt = $i==5 ... $i==10) { print "$i - $cnt\n"; } }
5 - 1 6 - 2 7 - 3 8 - 4 9 - 5 10 - 6E0And the other one:
which prints:for my $i (1 .. 15) { if((my $first = $i==5) ... (my $last = $i==10)) { # note: $first will be undefined for any but the first line be +cause of the 3 dots # and $last will be undefined for the first line local $^W; print "$i - $first / $last\n"; } }
5 - 1 / 6 - / 7 - / 8 - / 9 - / 10 - / 1
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Re: Matching between START and END revisited
by PenguinFeva (Acolyte) on Oct 18, 2003 at 11:34 UTC |