2013-05-01 40 views
2

因此,我測試了一個使用實驗性嵌入式代碼功能的正則表達式。我的測試工作,所以我闡述了它做一個更復雜的腳本,但遇到了錯誤。我將錯誤追溯到正則表達式中的一個變量,而不是嵌入式代碼中。我嘗試在建議的eval中執行正則表達式,但發現這樣做不起作用,因爲我無法在eval的正則表達式之後訪問特殊變量。我最終重新編寫了代碼,不使用嵌入式代碼策略,但我仍然好奇爲什麼它不起作用。我在一對perl的簡化問題下面的俏皮話:如何使用嵌入式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變量一起工作 - a方式允許我使用特殊變量

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

事後?我需要使用eval嗎?

感謝, 羅布

+0

一個問題做同樣的事情,爲什麼你有一個子程序,它究竟是幹什麼的['reverse'] (http://perldoc.perl.org/functions/reverse.html)在標量環境中有用嗎? '$ rev = reverse($^N)'是你所需要的。 – TLP 2013-05-01 15:13:12

+0

是的。我知道這一點,但謝謝指出。我原本有你所建議的代碼,但正如我所提到的,我正在測試一些更復雜的代碼,並且我想在後續版本中調用另一個子代。所以這就是爲什麼我在測試中創建無用的子。 – hepcat72 2013-05-01 19:10:26

回答

2

您需要使用

use re 'eval'; 

它讓Perl的知道你是知道的模式進行插值,可以執行任意代碼,您確定這一點。它是詞法範圍的,所以它只會影響文件中的正則表達式或使用它的curlies中的正則表達式。

既然你有一行代碼,你可以使用命令行選項,想到

-Mre=eval 
+0

據我所知,'use re'eval';'不影響對任何變量的訪問,並且當我添加該行時,您的代碼工作正常,因此您必須更清楚地說明您的意思。允許我使用特殊變量'$ \'','$&','$''和'@ -'「。 – ikegami 2013-05-01 15:08:09

+0

我正在將我的模式匹配包裹在一個eval中,這些變量的結果值似乎是垃圾。我顯然不明白這個錯誤是告訴我在代碼中加入「use re'eval'」這一行。我認爲這是暗示我在eval中包裝正則表達式。 – hepcat72 2013-05-01 18:22:56

+0

@ hepcat72,所以一切都很好? – ikegami 2013-05-01 18:24:53