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

时间:2013-05-01 14:56:48

标签: regex perl eval

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

这有效:

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])))) }'

那么为什么不呢?:

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])))) }'

我得到的错误是:

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

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

$`, $&, $', and @- 

之后?我需要使用eval吗?

谢谢, 罗布

1 个答案:

答案 0 :(得分:3)

您需要使用

use re 'eval';

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

由于您有一个单行,您可以使用命令行选项

执行相同操作
-Mre=eval