如何解决“正则表达式中的空转左括号在这里在正则表达式中是非法的”错误?

问题描述

我正在尝试配置一个使用生成的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

解决方法

Perl 5.26进行了一项更改,要求转义大括号。这是讨论它的Perl更新日志:https://perldoc.perl.org/5.26.0/perldelta.html

大概该脚本是针对Perl的早期版本编写的...

如果Perl脚本仍保留在某个地方,我建议您提交错误或(更好)发布PR来解决此问题。

否则,您可以使用Perl的较早版本,也可以修复本地副本。

编辑 修复示例:

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

要回答您的特定问题,您需要以与示例中的$相同的方式转义花括号-带有反斜杠,如下所示:

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

或者它们可以在方括号内用作字符类:

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