Perl中的变量赋值的正则表达式失败

时间:2012-09-04 23:40:07

标签: regex perl

我想知道为什么以下无法在匹配后将正则表达式匹配的值(IP地址)分配给$ ipaddress变量。我尝试了一些推荐的方法(显然我是Perl的新手),但他们都失败了。在执行匹配时,是否每个匹配都存储在$ 1变量中,这些变量的范围是1-9,因此第一个变量默认为$ 1?

代码是:

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

1 个答案:

答案 0 :(得分:6)

您正在使用非捕获组(?:...),该组永远不会分配给匹配变量。

将表达式的(?:[0-9]{1,3}\.){3}部分包裹在()中以捕获到$1

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