qr/STRING/
的{{3}}说:
此运算符引用(并可能编译)其
STRING
作为a 正则表达式。
令我担心的是括号中的部分。我想不出任何我不希望它从STRING
编译正则表达式的情况。这个括号语句是否只是狡猾的词语来涵盖未来不需要编译的情况,或者今天(或者在早期版本的Perl中)是否会出现STRING
无法编译的情况?
答案 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
}