如何使用嵌入式 perl 代码评估正则表达式

hep*_*t72 3 regex perl eval

所以我测试了一个利用实验性嵌入代码功能的正则表达式。我的测试成功了,所以我详细说明了它来做一个更复杂的脚本,但遇到了错误。我将错误追溯到在正则表达式中而不是在嵌入代码中的变量的简单使用。我尝试在建议的 eval 中执行正则表达式,但发现这不起作用,因为在 eval 的正则表达式之后我无法访问特殊变量。我最终重新编写了代码以不使用嵌入式代码策略,但我很好奇为什么它不起作用。我在下面的一对 perl one-liners 中简化了问题:

这有效:

perl -e '$_ = "The brown fox jumps over the lazy dog ABC god yzal eht revo spmuj xof nworb ehT";
    while (/(.{10,41})(?{$cap = $^N;$rev = r($cap);})(...)(??{$rev})/ig {
        print("$1\n")
    }
    sub r { return(join("",reverse(split("",$_[0])))) }'
Run Code Online (Sandbox Code Playgroud)

那为什么不呢?:

perl -e '$_ = "The brown fox jumps over the lazy dog ABC god yzal eht revo spmuj xof nworb ehT";
    $f=10;
    $e=41;
    while (/(.{$f,$e})(?{$cap = $^N;$rev = r($cap);})(...)(??{$rev})/ig) {
        print("$1\n")
    }
    sub r { return(join("",reverse(split("",$_[0])))) }'
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

Eval-group not allowed at runtime, use re 'eval' in regex 
m/(.{10,41})(?{$cap = $^N;$rev = r($cap);})(...)(??{$rev})/ at -e line 1.
Run Code Online (Sandbox Code Playgroud)

有没有办法让它与$f$e变量一起工作- 一种允许我使用特殊变量的方法

$`, $&, $', and @- 
Run Code Online (Sandbox Code Playgroud)

然后?我需要使用 eval 吗?

谢谢,罗布

ike*_*ami 5

你需要使用

use re 'eval';
Run Code Online (Sandbox Code Playgroud)

它让 Perl 知道您知道被内插的模式可以评估任意代码,并且您可以接受。它是词法范围的,因此它只会影响文件中的正则表达式或使用它的卷曲中的正则表达式。

由于您有一个单行,您可以使用命令行选项执行相同的操作

-Mre=eval
Run Code Online (Sandbox Code Playgroud)