4

所以我测试了一个利用实验性嵌入式代码功能的正则表达式。我的测试成功了,所以我解释了它来做一个更复杂的脚本,但遇到了错误。我将错误追溯到在正则表达式中而不是在嵌入式代码中的变量的简单使用。我尝试在建议的 eval 中执行正则表达式,但发现这行不通,因为在 eval 的正则表达式之后我无法访问特殊变量。我最终重新编写了代码以不使用嵌入式代码策略,但对它为什么不起作用感到好奇。我在下面的一对 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 @- 

然后?我需要使用评估吗?

谢谢,罗伯

4

1 回答 1

5

你需要使用

use re 'eval';

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

因为你有一个单行,你可以使用命令行选项做同样的事情

-Mre=eval
于 2013-05-01T14:58:14.457 回答