2012-09-04 60 views
2

我想知道爲什麼在匹配後,下面的表達式無法將正則表達式值的值(ip地址)賦值給$ ipaddress變量。我嘗試了一些推薦的方法(我明顯是Perl新手),但他們都失敗了。在執行匹配時,每個匹配是否存儲在$ 1變量中,範圍是1-9,因此第一個默認爲$ 1?正則表達式到Perl中的變量賦值失敗

代碼是:

sub block_match { 

    my $line_instance_b = $_[0]; 
    my $ipaddress; 

    if ($line_instance_b =~ /banned_ip|Found UltraSurf Signature|ip_block /) { 
    $ipaddress = $1 if ($line_instance_b =~ /\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/); 
    print "Found ip address: ", $ipaddress, "in the following line: \n", 
    $line_instance_b; 
    } 
    else { 
    print "Not a block line: \n", $line_instance_b, "\n" 
    } 
} 

它是對匹配的行是:

INIT: banned_ip add 208.67.219.132 for FreeGate 
+0

在列表上下文匹配返回捕獲的列表,你可以做'我($ ip地址)= $ line_instance_b =〜/... /'而不是。另外,我的學生必須指出,你的正則表達式完全排除了IPv6地址的可能性,它最終會咬你。 –

回答

6

您使用非捕獲組,(?:...),這是從來沒有分配給一個變量匹配。

包裹(?:[0-9]{1,3}\.){3}部分()表達的捕捉到$1

$ipaddress = $1 if $line_instance_b =~ /\b((?:[0-9]{1,3}\.){3})[0-9]{1,3}\b/; 
#           ^~~~~~~~~~~~~~~~~~~~^ 
+0

太棒了。謝謝喬恩。這確實奏效,現在我知道該再讀些什麼。感謝您抽出寶貴的時間 :) – user1647568