これは、IPアドレスと一致するPerl正規表現からのフォローアップです。問題を正しく解決する方法を示したかったのですが、予期しない動作に遭遇しました。
use 5.010;
use strictures;
use Data::Munge qw(list2re);
use Regexp::IPv6 qw($IPv6_re);
use Regexp::Common qw(net);
our $port_re = list2re 0..65535;
sub ip_port_from_netloc {
my ($sentence) = @_;
return $sentence =~ /
( # capture either
(?<= \[ )
$IPv6_re # IPv6 address without brackets
(?= \] )
| # or
$RE{net}{IPv4} # IPv4 address
)
: # colon sep. host from port
($port_re) # capture port
/msx;
}
my ($ip, $port);
($ip, $port) = ip_port_from_netloc 'The netloc is 216.108.225.236:60099';
say $ip;
($ip, $port) = ip_port_from_netloc 'The netloc is [fe80::226:5eff:fe1e:dfbe]:60099';
say $ip;
2番目の一致は失敗します。IPv6アドレス内ですでに一致しuse re 'debugcolor'
ていることを明らかにします。私は貪欲をスイッチオフしなかったので、これは私を驚かせます。私はそれがまですべてをむさぼり食うことを期待しました、そしてそれから分離する結腸とそれに続くものと一致します。:($port_re)
:5
?
]
なぜこれが起こるのですか、そして救済策は何ですか?