Chinaunix首页 | 论坛 | 博客
  • 博客访问: 476092
  • 博文数量: 104
  • 博客积分: 3455
  • 博客等级: 中校
  • 技术积分: 1216
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-18 18:33
文章分类

全部博文(104)

文章存档

2015年(3)

2014年(1)

2013年(7)

2012年(8)

2011年(11)

2010年(18)

2009年(56)

我的朋友

分类:

2009-11-18 11:09:16

正则表达式的字符串是特殊的双引号字符串.(分隔符不为单引号时).
对正则字符串,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) |
0

上一篇:Pack/Unpack 总结

下一篇:what a fucking day!

给主人留下些什么吧!~~