我想知道为什么以下无法在匹配后将正则表达式匹配的值(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
答案 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/;
# ^~~~~~~~~~~~~~~~~~~~^