2

我想知道为什么以下内容在匹配后无法将正则表达式匹配的值(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
4

1 回答 1

6

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

(?:[0-9]{1,3}\.){3}将要捕获的表达式部分包装()$1

$ipaddress = $1 if $line_instance_b =~ /\b((?:[0-9]{1,3}\.){3})[0-9]{1,3}\b/;
#                                         ^~~~~~~~~~~~~~~~~~~~^
于 2012-09-04T23:44:03.080 回答