Perl中的qr / STRING /运算符如何决定是否编译STRING?

时间:2009-12-02 15:17:39

标签: regex perl

qr/STRING/的{​​{3}}说:

  

此运算符引用(并可能编译)其STRING作为a   正则表达式。

令我担心的是括号中的部分。我想不出任何我不希望它从STRING编译正则表达式的情况。这个括号语句是否只是狡猾的词语来涵盖未来不需要编译的情况,或者今天(或者在早期版本的Perl中)是否会出现STRING无法编译的情况?

3 个答案:

答案 0 :(得分:13)

文档的“可能编译”部分可能是指如下所示的情况,其中qr//的参数是已经编译的正则表达式:

use re 'debug';

$re1 = qr/foo/;
$re2 = qr/$re1/;

运行该程序只显示正在编译的一个正则表达式。

无论该段落的意图如何,对内部细节的狡猾暗示并不清楚文档制作。我认为文档补丁会有所帮助。

答案 1 :(得分:2)

编辑:这个答案是错误的(或者至少是错误的)但是在评论中有一些值得保留的有趣讨论。 John Siracusa's answer似乎走在了正确的轨道上。


qr//的文档声明了

  

STRING的插值方式与   模式在m / PATTERN /.

可能包括不重新编译模式未更改的正则表达式的行为,或者在不包括插值变量的情况下不能更改的行为。例如,您不需要在循环的每次迭代中重新编译此模式:

foreach my $char ('a' .. 'z') {
    my $vowel = qr/[aeiou]/;
    say "$char is a vowel" if $char =~ $vowel;
}

答案 2 :(得分:1)

如果正则表达式包含任何内插字符串,它总是编译(如果你使用/ o开关可能不会 - 我承认/ o总是让我困惑)。如果正则表达式只包含文字文本,我相信亚当的答案是正确的。

IIRC意在处理这种情况:

while (my $foo = $something->next) {
     my $regex1 = qr/ab(cd+)ef?/; # only compiled once
     my $regex2 = qr/ab${foo}*ef/; # compiled every time through the loop
     # do stuff with $regex1 and $regex2
}