正则表达式的字符串是特殊的双引号字符串.(分隔符不为单引号时).
对正则字符串,Perl将分两步进行:
一.当成特殊的双引号字符串处理.
二.把第一步处理后的字符串传递给正则引擎处理.
第一步的处理是很复杂的,与一般的双引号字符串有很大的区别.
(1) 不在末尾的$将进行变量内插.在末尾的$将z作为正则表达式的锚点.
(2) \U \u \L \l \Q \E 必须在第一步进行.
其他的反斜杠替换都在第二步进行.
e.g.
#/usr/bin/perl -w
$x='\U';
$y='\n';
$z="\n";
print "ABC" =~ m/${x}abc/; # 不匹配
print "ABC" =~ m/\Uabc/; # 匹配
print "\n" =~ m/$y/; # 匹配
print "\n" =~ m/$z/; # 匹配
print "\n" =~ m/\n/; # 匹配
我的理解:
正则表达式的元字符序列和双引号的转义字符有很多重复的.所以在两步都可以处理这些字符.而在正则引擎的内部没有对\U系列的处理,所以必须在第一步处理,所以我不把\U系列看成是真正的元字符序列.而只是双引号的转义字符,所以必须在第一步处理.而\t等在正则引擎内部有处理,而在第一步处理这么字符可能造成混乱,所以推迟到第二步来处理,比如如果第一步就处理了 \s,将变为 s,无视了反斜杠,传给正则引擎的将只是s,这与实际不符的.
所以第一步不应该处理元字符序列的反斜杠,都推迟到第二步来处理.
阅读(1147) | 评论(0) | 转发(0) |