今天说的也算是perl正则表达式的一两点高级特性--命名捕获与匹配变量,如果能够掌握的话,对于提升能力和效率都有帮助。

 
  
  1. #!/usr/bin/perl -w 
  2. =pod 
  3. 命名捕获--给匹配上的内容加上标签 
  4. 捕获到的内容都会保存在%+散列中,这个散列的key为对应的标签; 
  5. 方便之处就是利于程序扩展和阅读,不用繁琐的一个一个去数括号来获取匹配变量 
  6. =cut 
  7. use strict; 
  8. my $str = "jack and rose"
  9. if ($str =~ /(?<first>\S+) (and|or) (?<second>\S+)/) { 
  10.     my ($first$second) = ($+{first}, $+{second}); 
  11.     print "$first\n$second\n";  # jack, rose 
  12.  
  13. my $str1 = "name:zt,age:19,fav:sport"
  14. if ($str1 =~ /(?<name>\S+),age.+,(?<fav>\S+)/) { 
  15.     my ($name$fav) = ($+{name}, $+{fav}); 
  16.     print "$name, $fav\n";  # name:zt, fav:sport 
  17.  
  18. =pod 
  19. 匹配变量 
  20. 希望通过这个例子可以让没有应用过匹配变量的同学开始使用匹配变量,关于匹配变量的争议也很多,有人说它太慢 
  21. 不过对于动态语言来说,慢那么一点没多大影响,方便最重要, 尤其在用正则匹配替换标记语言时很方便,比如处理html或者xml文件 
  22. =cut 
  23. my $str2 = "happy new year!"
  24. $str2 =~ /new/; 
  25. print <<"EOF";    
  26. prematch: $` 
  27. match: $& 
  28. postmatch:$' 
  29. EOF 
  30.  
  31. # 修改页面元素 
  32. open my $html"< index.htm" 
  33.     or die "open failure: $!"
  34. while (<$html>){ 
  35.     if (/<div>\s*(.*?)\s*<\/div>/){ 
  36.         $_ = $`. change_div($1) . $'; 
  37.     } 
  38.     print $html $_
  39. close $html

    根据上面我写出来的简单实用实例,可以方便推而广之道大家自己的应用场合,希望有用。