Perl:为什么这个表达式不适用于新版本的Perl?

时间:2018-03-12 22:13:30

标签: perl

我正在尝试运行Perl脚本,这会产生以下错误:

  

正则表达式中未转义的左括号在正则表达式中是非法的;标记为< - HERE in m / ^(。)\ $ ENV {< - HERE(。)}(。*)$ / at / root / cesm1_2_0 / scripts / ccsm_utils / Case.template / ConfigCase.pm第1180行。   在./create_newcase第361行的require中编译失败

违规代码是:

if($text =~/^(.*)\$ENV{(.*)}(.*)$/){
    ...
}

代码中早先出现了一个问题,原因是"使用了比该代码支持的更新的Perl版本" (参见:https://bb.cgd.ucar.edu/machine-configuration-and-generating-domain-file),所以我希望Perl中的正则表达式语法已经改变。

有人可以将此行翻译为与当前版本的Perl兼容吗?

2 个答案:

答案 0 :(得分:4)

{现在始终被视为正则表达式元字符。如果未转义的角色是非法的,您可以通过逃避它来使其合法化。

$text =~/^(.*)\$ENV\{(.*)}(.*)$/
                   ^---- new character

请参阅https://metacpan.org/pod/distribution/perl/pod/perl5260delta.pod#Unescaped-literal-"{"-characters-in-regular-expression-patterns-are-no-longer-permissible

答案 1 :(得分:2)

试试这个:

if ($text =~/^(.*)\$ENV\{(.*)\}(.*)$/) {