还是基本功不扎实!最近写一个用LWP从网上取网页的程序才发现了正则表达式里/g修饰符的另一个妙用,当她遇到while loop结构并“有幸”做这个循环的判断条件时,奇妙的事情便发生了:)
正则表达式的/g修饰符是用来表达“全局查找的”,举个例子来说:
$a = "no more pains, no more gains";
$a =~ s/no//g;
print "$a\n";
那么,输出的结果就是:
"more pains, more gains"
呵呵,本来的双重否定表示肯定,现在变成了肯定句了:)/g的作用就是所谓的“全局查找”,然后前面的"s"指明将找到的字符“替换”成空,就是这样。
我们试一下把/g去掉:
$a = "no more pains, no more gains";
$a =~ s/no//;
print "$a\n";
那么,结果就是如下:
"more pains, no more gains":)
呵呵,只去掉了一个否定,是不是太苦了自己?:) 没有/g修饰符,正则表达式只找到并替换第一个匹配的字符就不查下去了。
可是,在while loop结构中,如果while的条件里是用带/g的正则表达式,则/g有不同的含义。
还是举个例子:
$a = '$one @two $three $four @five $six @seven @eight $nine $ten';
while($a =~ /\$(\w+)/g){
print "scalar name:$1\n";
}
结果如下:
scalar name:one
scalar name:three
scalar name:four
scalar name:six
scalar name:nine
scalar name:ten
其结果就是把美元起头的字符全“捡”出来(呵呵,够势利的:)见钱眼开啊:))。这里,要注意的是while当中的条件:
$a =~ /\$(\w+)/g
^^^^^^^^^^^^^^^^
正因为有/g修饰符,所以,每次循环的时候,在重新计算表达式的时候会perl会“记住”上一次匹配的位置,而不是每次都从头开始匹配,直到匹配到最后一个后,条件不符之后跳出循环。Perl真是"太聪明了",显出我基本功是多么的不扎实,显得很笨!
我们如果把/g去掉,那么这个程序在处理while条件时,就会总在第一个匹配的地方团团转,成了死循环,这正是我当初担心的。功夫欠佳啊,不,是Perl太聪明了:)

No comments:
Post a Comment