找回密码
 注册
查看: 8072|回复: 0

perl语言正则表达式自动匹配变量

[复制链接]
发表于 2011-11-14 20:43:51 | 显示全部楼层 |阅读模式
还有三个匹配变量,你可以不花什么代价的使用它们◆,无论这些模式是否有括号。这是个好消息;但同时,这些变量的
名字相当古怪。
◆是的。没有完全免费的东西。它们“免费”只是说不需要匹配的括号而已。我们将在后面讲述其花费的代价。
如果能将这些变量名取得简单一些,如$gazoo, $ozmodiar,Larry 肯定会非常乐意。但在你自己的程序中你可能使用这些变
量名。为了让普通的Perl 程序员在记住Perl 所有的特殊变量之前能写程序◆,Larry 将大量Perl 内嵌的变量名取得相当古
怪,并且不符合变量名的命名规则。这里提到的三个变量名为: $&, $`, $'。它们看起来相当奇怪,但无论怎样,这就是其名
字◆。匹配上的那部分字符串将自动存储在$&之中。
◆同时也应当避免使用像$ARGV 这样的变量,但这些极少数的变量全是大写的。Perl 所有内嵌变量均可在perlvar 的帮助手册中找到。
◆如果不喜欢这些变量名,你可以使用English 这个模块,它试图将所有Perl 奇怪的变量名给与一个普通名字。但使用这个模块的人很少。
相反的,Perl 程序员开始越来越喜欢这这些有标点符号的变量名了,管它样子是否古怪呢。
if(“Hello there, neigbor”=~ /\S(\w+),/){
print “That actually matched ‘$&’.\n”;
}
匹配的部分是“there,”(空格,单词,和一个逗号)。变量$1 中的值为there,而$&为整个被匹配的部分。
匹配部分的前一部分存放在$`之中,后一部分被存到$'。另一种说法是,$`中含有正则表达式引擎在匹配成功前所找到的变
量,而$'为此模式还没有匹配的剩余部分。如果将这三个变量放在一起,你将得到原始字符串:
if (“Hello there, neighbor”=~ /\S(\w+),/){
pirnt “That was ($`)($&)($’)”;
}
输出的消息为(Hello)( there,)( neighbor),为这三个自动匹配变量的值。三个变量的值可能是空的,和之前数字匹配变量的例
子一样。它们和数字匹配变量有相同的作用域。通常,在下次成功匹配前其值不变。
现在,我们讨论我们之前说的“免费”问题。是的,自由是要代价的。这里的代价是,如果你使用了这三个自动匹配变量
中的任意一个,无论在程序的什么地方,其它地方的正则表达式的运行数度会变慢一些。虽然,变慢的程度不大,但已经
足够让人担忧,因此许多Perl 程序员从不使用这些自动匹配变量◆。相反的,使用的替代的方法。例如,如果需要使用$&,
那么在整个模式上加上括号,并使用$1 代替。
◆许多人没有测试其程序的实际效率,以判断其替代方法是否节约了时间。这些变量看起来是有害的, 但我们不因该在实际比较过它们的
效率之前而责备它们;许多程序从这个三个变量中获益,这些程序一周只运行几分钟,优化和评估其效率是浪费的。但,如果我们对一
毫秒都非常关心呢?顺便提一句,Perl 开发者正着手解决这一个问题,但在Perl6 之前可能都不会有好的答案。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|生物统计家园 网站价格

GMT+8, 2024-11-21 23:53 , Processed in 0.020162 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表