in reply to Matching between START and END revisited

There are two approaches for this kind of question. Both involve examining the range operator a bit more closely.

Option 1 is to catch the return value of the range operator itself, which you now only use as a boolean.

if(my $cnt = /^ policy-map $ouputpol/ ... / policy-map/) {
(Precedence of "..." is higher than the assignment.)

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:

print unless $cnt==1 || $cnt =~ /E/;
Note that that suffix doesn't change the value of the number, while it's still a valid representation of it.

The second approach is to catch the return value of the left and right hand sides individually:

if(($my $first = /^ policy-map $ouputpol/) ... (my $last = / policy-ma +p/)) {
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.
print unless $first || $last;

For the people who want a simple standalone test, without requiring something ressembling your data:

for my $i (1 .. 15) { if(my $cnt = $i==5 ... $i==10) { print "$i - $cnt\n"; } }
which prints:
5 - 1
6 - 2
7 - 3
8 - 4
9 - 5
10 - 6E0
And the other one:
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"; } }
which prints:
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
    Arrrrgggghhhhhh.....
    Thank you....thank you.....thank you
    Mental block of note...... this works perfectly....you have no idea how this is going to help me with converting an exisiting QoS model to an AVVID compliant one.
    Thanks to bart