我负责将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)
所以,我有两个问题:
在老Perl版本中,$BaseLineRegExpA并$BaseLineRegExpB得到重新评估每一次$BaseLine的变化,但在新的Perl,事实并非如此.如何进行更改?我试过了$BaseLineRegExpA,它仍然没有改变.
在旧的Perl中,$BaseLineRegExpAevals to:,(?i-xsm:^F:\\dd\\)并且在新的Perl中,它可以逃避(?^i:^F:\\dd\\).我的问题是,?i-xsm:^和之间有什么不同?^i:^吗?
非常感谢,遗憾的是,这些是遗留脚本,我对Perl知之甚少.
所述o改性剂可以防止代入正则表达式重新评估的变量.很奇怪5.6在5.6上没有发生这种情况,但可能是因为qr该版本仍然是新的.删除它(/io改为/i)应该使事情按照你期望的方式工作.
该(?i-xsm)编码的正则表达式的修正标志是有效(i导通,x,s,和m被关闭).在perl 5.14的某个时候,Perl得到了一些新的正则表达式修饰符标志,这将改变所有正则表达式的字符串化.由于这已经是一个向后不兼容的变化,因此决定以限制在路上添加任何新标志所引起的麻烦的方式进行,因此该^字符用于表示"默认"标志集.所以(?^i)意味着"默认标志,加上i标志".它们的意思基本相同,你不必担心.