我正在尝试创建一个IP表列表,在那里我可以看到哪些IP正在使用,哪些没有使用。
为此,我使用Net::IP库。代码片段:
my @IPsinrange = &getAllIPs($range) ; #range is x.x.x.x/subnet format
sub getAllIPs {
my $ip = new Net::IP ($range) || die;
my @IPs ;
# Loop
do {
push @IPs, $ip->ip() ;
} while (++$ip);
return @IPs ;
} 这适用于x.0/24网络,对于1.2.3.4/32网络也是如此,但例如,当我使用1.2.3.4/29时,循环就会死掉。我认为这可能是因为在使用中没有IP地址,但是在这个范围内有4个IP是活着的。
发布于 2016-10-13 15:02:04
这不起作用的原因是,模块要求您发送适当的网络地址作为给定IP前缀的起点。
由于要使用/29前缀,有效范围为:
1.2.3.0/29
1.2.3.8/29
1.2.3.16/29
...etc正如注释中提到的那样,文档指出,正确使用构造函数以获得正确的诊断输出是:
$ip = Net::IP->new('1.2.3.0/29') or die (Net::IP::Error());发布于 2016-10-13 16:51:57
我建议您改用Net::CIDR函数库。函数Net::CIDR::cidr2octets完全满足您的需要,并且不坚持范围的基地址是网络地址
下面是一个示例,它将测试数据1.2.3.4/29用于范围
use strict;
use warnings 'all';
use feature 'say';
use Net::CIDR;
my @range = Net::CIDR::cidr2octets('1.2.3.4/29');
say for @range;输出
1.2.3.0
1.2.3.1
1.2.3.2
1.2.3.3
1.2.3.4
1.2.3.5
1.2.3.6
1.2.3.7如果要将可能不使用网络地址作为前缀的CIDR块“正常化”,则可以使用Net::CIDR::cidr2range,然后是Net::CIDR::range2cidr。给定'1.2.3.4/29',第一个返回1.2.3.0-1.2.3.7,当该结果被传递到Net::CIDR::range2cidr时,我们得到一个规范化的结果
就像这样
Net::CIDR::range2cidr(Net::CIDR::cidr2range('1.2.3.4/29'));输出
1.2.3.0/29https://stackoverflow.com/questions/40023914
复制相似问题