2012-09-04 33 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