代码之家  ›  专栏  ›  技术社区  ›  Fulvio Scapin

perl5中破坏的正则表达式捕获变量的非破坏性替代?

  •  1
  • Fulvio Scapin  · 技术社区  · 6 年前

    我注意到一种行为,我觉得很可疑。在perl 5.18和perl 5.22上进行了确认。

    下面是一条简化的单行线,以进行说明。

    $ echo -e "A B C D\n# E F G" | perl -wnE 'm{(.) (.) (.) (.)}; say($1,$2,$3,$4); say "HELLO $1 " . ($1 =~ s/\w/###/r) ." $2 $3 $4"'
    ABCD
    Use of uninitialized value $2 in concatenation (.) or string at -e line 1, <> line 1.
    Use of uninitialized value $3 in concatenation (.) or string at -e line 1, <> line 1.
    Use of uninitialized value $4 in concatenation (.) or string at -e line 1, <> line 1.
    HELLO A ###   
    #EFG
    HELLO # # E F G
    

    显然,在任何捕获相关变量上调用非破坏性替换未定义,或者以某种方式阻止访问任何先前定义的捕获相关变量。使用命名捕获和 %+ 搞砸

    这对我来说似乎是个错误,但我不知道我是否错过了什么。

    提前谢谢。

    1 回复  |  直到 6 年前
        1
  •  2
  •   choroba    6 年前

    看见 perlvar :

    Perl在成功匹配时设置这些变量

    因此,任何成功的匹配都会清除这些值,匹配变量本身是否受匹配的约束并不相关。