2011-11-21 95 views
1

我一直在做一些搜索,並沒有找到答案。爲什麼這不起作用?使用變量作爲正則表達式替換參數

$self->{W_CONTENT} =~ /$regex/; 
    print $1; #is there a value? YES 
    $store{URL} =~ s/$param/$1/; 

是$ 1有一個值。 $ param被替換,但它被替換爲無。我看好$ 1有價值。如果我用文本替換而不是「$ 1」,它可以正常工作。請幫忙!

回答

6

對於$1有一個值,你需要確保$param有括號()在裏面。即下面的問題與你正在解釋的問題類似。

my $fred = "Fred"; 
$fred =~ s/red/$1/; 
# $fred will now be "F" 

但這部作品

my $fred = "Fred"; 
$fred =~ s/r(ed)/$1/; 
# $fred will now be "Fed" 

現在,如果你想使用$1從你的第一個正則表達式中,你需要複製它的第二個。每個正則表達式評估重置$1 ... $&。所以你想要這樣的東西:

$self->{W_CONTENT} =~ /$regex/; 
print $1; #is there a value? YES 
my $old1 = $1; 
$store{URL} =~ s/$param/$old1/; 
+0

謝謝!這很好。我正在玩括號,但我認爲1美元沒有被重置。整蠱! – Mike

+1

如果有任何'$ param'將包含元字符的機會,你可以考慮'/ \ Q $ param \ E/$ old1 /'。 – TLP

1

反向引用(如$ 1)不應在表達式中使用;你會用一個不同的符號 - 進行概述,查看Perl Regular Expressions Quickstart

考慮獲取$ 1的值並將其存儲在另一個變量中,然後在正則表達式中使用該值。

+0

謝謝克里斯託弗! – Mike