SPUG: range operator
Jacinta Richardson
jarich at perltraining.com.au
Thu Mar 29 03:38:31 PDT 2007
Florentin wrote:
> # Expect to print only a and b --> it prints all from x1 to x3 as above
> while( <>) {
> if(/$start/+1 ../$end/-1) {
> print ;
> }
> }
After running through Perltidy, this is the same as writing:
while (<>) {
if ( /$start/ + 1 .. /$end/ - 1 ) {
print;
}
}
which of course is the same as writing:
while (<>) {
if ( ((/$start/) + 1) .. ((/$end/) - 1) ) {
print;
}
}
So, we're doing the regular expression (in a scalar context) and it's returning
true or false then we're adding (or subtracting) one from that value. So to walk
through you're input we get:
# cat _a # first regexp returns false, add 1 to make true
# x1 # end of range is false
# a # end of range still false
# x5 # second regexp returns true, minus 1 for a value of false
# x1 # end of range still false
# b # end of range still false
# x3 # second regexp: true minus 1, end of range still false
# c # end of range still false
# d # end of range still false
so it prints everything. Thanks to the plus one, the first part of your range
is always true, and the minus one causes the end of the range to be false even
when the regexp is true.
I'm not quite sure what you wished to achieve with the above code, but that
probably wasn't it.
> # Expect to print only a and b --> prints nothing ??
> while( my $x = <>) {
> if($x=~m/$start/+1 .. $x=~m/$end/-1){
> print ;
> }
> }
This behaves the same as the previous one. Except you're printing $_ rather
than $x. If you had turned warnings on for your test code, Perl would have told
you about this.
All the best,
Jacinta
More information about the spug-list
mailing list