是否可以将正则表达式编写为一个表达式来检查是否在2个范围内找到了IP?
我可以分两步完成:
if ($ip =~ /$range1/ and $ip =~ /$range2/ ) {
print "intersection"
}
但我想知道是否可以在一个正则表达式中执行此操作:
if ($ip =~ /$my_regex/ ) {
print "intersection";
}
答案 0 :(得分:3)
您可以使用模块NetAddr::IP
:
use strict;
use warnings;
use NetAddr::IP;
my @addresses = (
NetAddr::IP->new('192.168.172.1/255.255.0.0'),
NetAddr::IP->new('10.1.0.0/255.0.0.0'),
);
my $address_to_check = NetAddr::IP->new($IP_TO_CHECK);
foreach my $address_in_list (@addresses) {
if ($address_to_check->within $address_in_list) {
# do something
}
}
答案 1 :(得分:2)
以下是Perl的解决方案。
为什么不使用NetAddr::IP
让它处理呢?例如
#!/usr/bin/perl
use strict;
use warnings;
use NetAddr::IP;
my @addresses = (
new NetAddr::IP '216.239.32.0/255.255.32.0',
new NetAddr::IP '64.157.227.255/255.255.252.0'
);
my $banned = 0;
my $visitor_address = NetAddr::IP->new($visitor_ip);
foreach my $banned_address (@addresses) {
if ($visitor_address->within $banned_address) {
$banned = 1;
last;
}
}
阅读文档和可用方法:https://metacpan.org/pod/NetAddr::IP
答案 2 :(得分:0)
是的,可以使用先行断言将两个独立的子表达式连接到一个正则表达式中:
if ($ip =~ /^(?=.*$range1)(?=.*$range2)/s ) {
print "intersection"
}
但是,如果您真的在处理IP地址,则应使用NetAddr::IP
之类的模块。