2

次の例では、一致した後に $ipaddress 変数に正規表現一致の値 (IP アドレス) を割り当てられないのはなぜでしょうか。私はいくつかの推奨される方法を試しました (明らかに Perl は初めてです) が、すべて失敗しました。マッチを実行するとき、各マッチが 1 から 9 の範囲の $1 変数に格納されるので、最初の値はデフォルトで $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 に答える