2012-06-13 58 views
0

不知道如何發生這種情況,但似乎我的perl正則表達式匹配不會更新到下一個匹配,匹配後。它不會更新每個匹配的$ &和$ 1變量,而是會陷入第一個變量。Perl不更新到下一個匹配

我到處都是眼睛,發現這非常令人沮喪。

查看下面調試器的輸出,如您所見,第一個匹配是有意義的,但第二個匹配不適用。

感謝

DB<79> $riz =~ m{url=(.*?)Support}; 

    DB<80> p$&; 
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support 
    DB<81> $riz =~ m{href=(.*artist?)}; 

    DB<82> p $&; 
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support 
    DB<83> 

更新: 這裏的顯示文本「藝術家」是字符串中另一個樣品,但現在還沒有找到它。 $ riz的值是一個巨大的HTML代碼,所以很難發佈。

DB<103> $riz =~ m{url=(.*?)Support}; 

    DB<104> p $&; 
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support 
    DB<105> $riz =~ m{artist}; 

    DB<106> p $&; 
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support 
    DB<107> p string.index($riz,"artist"); 
string105 
    DB<108> 

我的$ RIZ是在這個環節的所有HTML http://itunes.apple.com/us/app/id385972277

當您使用的用戶代理 的iTunes/10.2(在Macintosh; U; PPC的Mac OS X 10.2)


下面是另一個相同的示例$ riz

DB<128> $riz =~ m/.*/; 

    DB<129> p $&; 
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support 
    DB<130> 
... 
    DB<136> p substr $riz,0,20; 
    <?xml version="1.0" 
     DB<137> 

我的意思是,這不是很荒謬嗎?它應該只輸出$ riz no的值?正如你可以看到的是所顯示的不同形式。另外,m /.*/怎麼可能不是一個有效的正則表達式?

+0

請問您可以顯示$ riz嗎? –

+0

$ riz的價值是多少? – Ben

+1

如果$ riz不匹配,那麼'$&'不會被修改。 –

回答

1

perldebug說這

不是由調試器識別的任何命令,直接執行 (eval'd)作爲在當前包Perl代碼。

請注意,所述eval受到隱式範圍的約束。因此任何 新引入的詞彙變量或任何修改的捕獲緩衝區 內容在eval後都會丟失。調試器對於學習Perl是一個很好的環境,但是如果您使用的材料交互式地進行實驗,那麼 應該在同一個範圍內,請將其填入一行。

所以$&$1等變量調試器命令的執行期間本地化的,並且都將丟失一個命令完成。

你可以使用

$riz =~ m{url=(.*?)Support}; print $&, "\n"; print $1, "\n"; 

$riz =~ m{url=(.*?)Support}; ($and, $one) = ($&, $1); 
p $and 
p $one 

,但沒有什麼東西在同一命令行一次正則表達式比較完成他們永遠失去了保護這些價值觀。

+0

謝謝,這最後至少解決了我的問題的一部分 –

+0

就像更新,這是100%的問題,使一切都不工作。是的,我的正規表達可能有錯誤,但那些看起來不一樣。一旦我正確編寫了調試器命令,其他一切都變得非常簡單。 +20分給鮑羅丁 –

+1

剛剛幾天前的高度相關:[爲什麼不eval'/(...)/'設置$ 1?](http://stackoverflow.com/questions/10909127/perl-why-doesnt- EVAL-設置-1) – daxim

2

$&在有成功匹配時更新。如果匹配不成功,則$&不會更新並保留其先前的值。請參閱perlvar中的$MATCH變量。 (perldoc perlvar並搜索$MATCH

1

這很好。 $&包含最後成功正則表達式匹配的字符串。我假設$riz的內容不包含/href=(.*artist?)/的匹配項。你應該檢查正則表達式匹配的返回值。

你是否知道/artist?/只會匹配artistartis