代码之家  ›  专栏  ›  技术社区  ›  Chas. Owens

Perl中的qr/string/操作符如何决定是否编译字符串?

  •  15
  • Chas. Owens  · 技术社区  · 16 年前

    这个 docs 对于 qr/STRING/ 说:

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

    让我担心的是括号中的部分。我想不出任何我不希望它从中编译regex的情况。 . 这个附加语句是否仅仅是用来覆盖将来不需要编译的情况的黄鼠狼的话,或者今天(或者在Perl的早期版本中)是否有这样的情况 字符串 将不编译?

    3 回复  |  直到 16 年前
        1
  •  13
  •   John Siracusa    16 年前

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

    use re 'debug';
    
    $re1 = qr/foo/;
    $re2 = qr/$re1/;
    

    运行该程序只显示正在编译的一个regex。

    不管这篇文章的意图如何,对内部细节的狡猾的暗示并不能清楚地说明文档的内容。我认为医生补片是有益的。

        2
  •  2
  •   Community Mohan Dere    8 年前

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


    文件 qr// 说明

    字符串的插入方式与 以m/pattern/表示的模式。

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

    foreach my $char ('a' .. 'z') {
        my $vowel = qr/[aeiou]/;
        say "$char is a vowel" if $char =~ $vowel;
    }
    
        3
  •  1
  •   Dan    16 年前

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

    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
    }