perl 如何修复“正则表达式中未转义的左大括号在正则表达式中是非法的”错误?

42fyovps  于 2022-11-15  发布在  Perl
关注(0)|答案(3)|浏览(210)

我正在尝试配置一个使用Perl脚本的生成。我在运行配置脚本(Perl版本v5.26.1)时遇到此错误

Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/^(.*)\$ENV{ <-- HERE (.*)}(.*)$/

有问题的代码是

if($text =~/^(.*)\$ENV{(.*)}(.*)$/){
            $text = $1.$ENV{$2}.$3;
        }

我对Perl很陌生,有人能帮忙吗?TY

ux6nzvsh

ux6nzvsh1#

Perl 5.26引入了一项更改,要求对文本大括号进行转义。下面是讨论该更改的Perl更改日志:https://perldoc.perl.org/5.26.0/perldelta.html
据推测,该脚本是针对Perl的早期版本编写的...
如果Perl脚本仍然在某个地方维护,我建议要么提交一个bug,要么(更好)发布一个PR来修复这个问题。
如果没有,您可以回退到Perl的早期版本,或者修复您的本地副本。
编辑修复示例:

if($text =~/^(.*)\$ENV\{(.*)\}(.*)$/){
        $text = $1.$ENV{$2}.$3;
    }
yptwkmov

yptwkmov2#

要回答您的特定问题,您需要使用与示例中$转义相同的方式对大括号进行转义-使用反斜杠,如下所示:

if ($string =~ /\{\}/) { ... }

也可以在括号内作为字符类使用:

if ($string =~ /[{}]/) { ... }
qvtsj1bj

qvtsj1bj3#

对于5.33(或5.34)之前的perl版本,出现此错误的一个可能原因是使用了{,n}组合符。早期的perl版本要求它是{0,n}

相关问题