Perl不会重新评估正则表达式变量

Nam*_*Ngo 1 regex perl

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

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;
            }
        }
     }
}
Run Code Online (Sandbox Code Playgroud)

所以,我有两个问题:

  1. 在老Perl版本中,$BaseLineRegExpA并$BaseLineRegExpB得到重新评估每一次$BaseLine的变化,但在新的Perl,事实并非如此.如何进行更改?我试过了$BaseLineRegExpA,它仍然没有改变.

  2. 在旧的Perl中,$BaseLineRegExpAevals to:,(?i-xsm:^F:\\dd\\)并且在新的Perl中,它可以逃避(?^i:^F:\\dd\\).我的问题是,?i-xsm:^和之间有什么不同?^i:^吗?

非常感谢,遗憾的是,这些是遗留脚本,我对Perl知之甚少.

hob*_*bbs 7

  1. 所述o改性剂可以防止代入正则表达式重新评估的变量.很奇怪5.6在5.6上没有发生这种情况,但可能是因为qr该版本仍然是新的.删除它(/io改为/i)应该使事情按照你期望的方式工作.

  2. 该(?i-xsm)编码的正则表达式的修正标志是有效(i导通,x,s,和m被关闭).在perl 5.14的某个时候,Perl得到了一些新的正则表达式修饰符标志,这将改变所有正则表达式的字符串化.由于这已经是一个向后不兼容的变化,因此决定以限制在路上添加任何新标志所引起的麻烦的方式进行,因此该^字符用于表示"默认"标志集.所以(?^i)意味着"默认标志,加上i标志".它们的意思基本相同,你不必担心.

  • @NamNgo,欢迎你.正如旁注,我已经使用Perl 15年了,并且没有*任何地方*我建议使用`/ o`.充其量只能实现非常小的性能提升,并且很容易被创建错误的可能性所抵消. (2认同)