2013-12-07 55 views
1

我要尋找一個較短的版本代碼perl的分配正則表達式匹配組while循環

my $s = 'test123abc456qwe789ghj999'; 

while($s =~ /(?<g1>\d+)[^\d]+(?<g2>\d+)/g) { 
    my ($g1, $g2) = ($1, $2); 

    #do s.th. with g1 and g2 
} 

我嘗試這樣做的,但它會導致死循環

my $s = 'test123abc456qwe789ghj999'; 

while(my ($g1, $g2) = ($s =~ /(?<g1>\d+)[^\d]+(?<g2>\d+)/g)) { 
    #do s.th. with g1 and g2 
} 

還是有可能在while循環中獲得匹配作爲散列?

(
    g1 => 123, 
    g2 => 456 
) 

(
    g1 => 789, 
    g2 => 999 
) 
+0

您的匹配已經被捕獲在'%+'哈希中。例如,你可以做一些類似'say $ + {g1} * $ + {g2};' –

回答

1

爲了您的正則表達式,你可以在你的地方否定字符類的使用\Dany non-digit)。您可以直接訪問指定的捕獲組。你必須使用%+散列。

while ($s =~ /(?<g1>\d+)\D+(?<g2>\d+)/g) { 

    # do something with $+{g1} 
    # do something with $+{g2} 

} 
+0

謝謝,所以不可能將匹配的組分配給標量?像這樣'while(my($ g1,$ g2)=($ s =〜/(? \ d +)[^ \ d] +(? \ d +)/ g))' – knv17

+0

請參閱[無限while循環](http://stackoverflow.com/questions/7374107/infinite-while-loop-in-perl) – hwnd