2012-04-11 109 views
3

我有一個簡單的Perl正則表達式,我需要保存爲變量。保存匹配的Perl正則表達式作爲變量

如果我打印:

print($html_data =~ m/<iframe id="pdfDocument" src=.(.*)pdf/g); 

它打印我要救什麼,而是試圖將其與保存時:

$link = $html_data =~ m/<iframe id="pdfDocument" src=.(.*)pdf/g; 

我得到一個「1」的價值$link。我認爲這是因爲它發現'1'匹配。但是,如何保存比賽內容呢?

+0

[的他來到小馬...](http://stackoverflow.com/a/1732454/554546) – 2012-04-11 20:15:22

回答

4

模式的匹配子表達式保存在變量$1$2等,您還可以得到整個匹配模式($&),但這是昂貴的,應當避免。

順便提一下,這裏的行爲區別是標量與列表上下文的結果;你應該瞭解它們,它們有何不同,以及它們如何影響各種Perl表達式的行爲。

+2

不要使用'$&' 。它會減慢每個不使用捕獲整個程序的正則表達式。不,在新版本的Perl中沒有改變,所以我從你的文章中刪除了這一點。如果你想要的東西沒有這個缺點,使用/ p和'$ {^ MATCH}'。參見[perlvar](http://perldoc.perl。org/perlvar.html)用於這些變量的文檔。 – ikegami 2012-04-11 20:21:43

6

請注意/ g以獲得所有匹配項。那些不可能被放入標量。你需要一個數組。

my @links = $html_data =~ m/<iframe id="pdfDocument" src=.(.*)pdf/g; 

如果你只是想在第一場比賽:

my ($link) = $html_data =~ m/<iframe id="pdfDocument" src=.(.*)pdf/; 

注意括號(和缺乏現在已經沒用/克)。你需要他們在列表上下文中調用m //。

+0

如果你正在嘗試做同樣的事情,標量環境中的/ g就好了。儘管如此,您並不需要它來獲取捕獲列表。 – 2012-04-11 23:59:11

+0

@brian d foy,我沒有在標量環境中說*/g *沒有用。我甚至沒有說在這裏沒有用。我說*標量上下文*在這裏沒有用處。 (雖然它仍然可以在標量上下文中完成:'my $ link = $ html_data =〜m /.../?$ 1:undef;') – ikegami 2012-04-12 18:26:43

0

從 'perlfunc' 文檔:

打印列表
打印字符串或字符串列表。

所以,print m//,其中m //確定返回值
通緝(wantarray?)是一個列表
(它appers米//而不捕捉組返回1或0的匹配通
或失敗,其中因爲m // g返回一個匹配列表)。

$link = M //只能是標量(相對於列出)上下文。
所以,m //返回匹配結果1(真)或0(假)。

0

我剛剛寫了這樣的代碼。它可能有幫助。它基本上和你的一樣,除了我的還有幾個括號。

my $path = `ls -l -d ~/`; 
#print "\n path is $path"; 
($user) = ($path=~/\.*\s+(\w+)\susers/); 

所以你從這個例子可能是這樣的東西,如果你試圖存儲整個事情?我不確定,但你可以用我的例子。我存儲無論是在(\ w +):

($link) = ($html_data =~ (m/<iframe id="pdfDocument" src=.(.*)pdf/g));