2017-12-18 178 views
0

例如,讓我們說我有這樣的事情:如何在Perl正則表達式中使用操作?

$_ = 23; 
$a = 2; 
print /$a $a+1/x; 

應打印1.基本上,是它可以使用正則表達式的字符串中的功能呢?

+0

從你的例子中很難知道爲什麼你不會在正則表達式之外進行操作 – beasy

回答

1

正則表達式中的變量插值與字符串中的變量插值幾乎相同。給定​​,字符串​​將是"2 2+1"。該變量已展開,但字符串中的代碼未執行。

圍繞這個的一個訣竅是在字符串中使用解引用引用。這使我們可以包含任意表達式,但語法有點麻煩。通常,我們用我們想包含的值創建一個數組引用,然後立即解引用它:@{[$x + 1]}。這與Ruby的#{...}插值或Bash $(...)命令替換類似。

所以正則表達式/$x @{[$x + 1]}/x會工作。

但在大多數情況下,這將更加清晰進行正則表達式之外的所有計算:

my $x = 2; 
my $y = $x + 1; 
/$x $y/x; 

Perl的正則表達式的語法也有語法,可以動態地生成正則表達式的部分。使用上面的變量插值,插值變量內容,然後編譯正則表達式。但高級正則表達式可能會在模式匹配期間更改變量的值。這些延遲的正則表達式可以用(??{ ... })語法編寫。這裏:/$x (??{ $x + 1 })/x。但是,這是一個非常先進且容易出錯的正則表達式特性。這也會比普通的正則表達式慢。

1

an extended pattern,它提供了在匹配運算符m/或替換運算符s///的匹配部分中的代碼執行。

它的版本替換代碼的回報,接着把它當作一種模式是

/(??{ code })/ 

所以你的情況

$_ = 23; 
my $x = 2; 
my ($m) = /(2(??{ $x+1 }))/; 
say $m; 

RE_EVAL: { 
    use re 'eval'; 
    my ($m) = /($x(??{ $x+1 }))/; 
    say $m; 
} 

比賽和捕獲23

這裏use re 'eval'明確允許這一點,通常由於安全原因不允許。

這是一個非常複雜的功能,它帶有複雜的警告。除了在上述鏈接中的輸入外,還請按照該文本中的鏈接閱讀有關Embedded Code Execution frequency

請不要使用這個複雜的工具,以方便或代替正確書寫的代碼。