【问题标题】:Perl does not reevaluate regex variablePerl 不会重新评估正则表达式变量
【发布时间】:2015-06-09 07:40:29
【问题描述】:

我负责将此 Perl 脚本从 Perl v5.6.1 (2001) 升级到 v5.20.2 (2015)。我有这 2 个正则表达式变量:

foreach (@filelist) {
    chomp;
    my $File = $_;
    if ( $File =~ qr/.+/o ) {
        if ( $BaseLine ) {

            $BaseLineRegExpA = qr/^\Q$BaseLine\E\\/io; #these 2 regexes
            $BaseLineRegExpB = qr/^\Q$BaseLine\E;/io;  #these 2 regexes

            if ( $File =~ /$BaseLineRegExpA/ ) {
                #...

            } elsif ( (!($File =~ /$BaseLineRegExpB/)) && (!(lc( $File ) eq lc( $BaseLine ) )) ) {
                $BaseLine = $File;
            }
        }
     }
}

所以,我有两个问题:

  1. 在旧 Perl 版本中,$BaseLineRegExpA$BaseLineRegExpB 每次 $BaseLine 更改时都会重新计算,但在新 Perl 中,它不会。我如何让它改变?我试过我的$BaseLineRegExpA,还是没变。

  2. 在旧 Perl 中,$BaseLineRegExpA eval 为:(?i-xsm:^F:\\dd\\),而在新 Perl 中,它 eval 为 (?^i:^F:\\dd\\)。我的问题是,?i-xsm:^?^i:^ 之间有什么不同吗?

非常感谢,不幸的是,这些是遗留脚本,我对 Perl 了解不多。

【问题讨论】:

    标签: regex perl


    【解决方案1】:
    1. o 修饰符可防止重新评估替换为正则表达式的变量。奇怪的是,您在 5.6 上并没有发生这种情况,但这可能是因为 qr 在那个版本中仍然是新的。删除它(将 /io 更改为 /i)应该会让事情按您预期的方式工作。

    2. (?i-xsm) 对有效的正则表达式修饰符标志进行编码(i 已打开,xsm 已关闭)。在 perl 5.14 左右的某个时候,Perl 获得了一些新的正则表达式修饰符标志,这将改变所有正则表达式的字符串化。由于这已经是一个向后不兼容的更改,因此决定以一种方式来限制由于添加任何新标志而引起的麻烦,因此^ 字符用于表示“默认”设置的标志。所以(?^i) 表示“默认标志,加上i 标志”。它们的含义基本相同,您无需担心。

    【讨论】:

    • 经过测试。 qr//o 在 5.6 中肯定被破坏了。 o 被忽略了。
    • @NamNgo 不客气。顺便说一句,我使用 Perl 已经 15 年了,没有任何地方我会推荐使用/o。充其量它只会带来非常小的性能提升,很容易被它产生错误的潜力所抵消。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多