首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用perl IP库在一系列IP上循环

使用perl IP库在一系列IP上循环
EN

Stack Overflow用户
提问于 2016-10-13 14:32:09
回答 2查看 321关注 0票数 0

我正在尝试创建一个IP表列表,在那里我可以看到哪些IP正在使用,哪些没有使用。

为此,我使用Net::IP库。代码片段:

代码语言:javascript
复制
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是活着的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-13 15:02:04

这不起作用的原因是,模块要求您发送适当的网络地址作为给定IP前缀的起点。

由于要使用/29前缀,有效范围为:

代码语言:javascript
复制
1.2.3.0/29
1.2.3.8/29
1.2.3.16/29
...etc

正如注释中提到的那样,文档指出,正确使用构造函数以获得正确的诊断输出是:

代码语言:javascript
复制
$ip = Net::IP->new('1.2.3.0/29') or die (Net::IP::Error());
票数 3
EN

Stack Overflow用户

发布于 2016-10-13 16:51:57

我建议您改用Net::CIDR函数库。函数Net::CIDR::cidr2octets完全满足您的需要,并且不坚持范围的基地址是网络地址

下面是一个示例,它将测试数据1.2.3.4/29用于范围

代码语言:javascript
复制
use strict;
use warnings 'all';
use feature 'say';

use Net::CIDR;

my @range = Net::CIDR::cidr2octets('1.2.3.4/29');

say for @range;

输出

代码语言:javascript
复制
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时,我们得到一个规范化的结果

就像这样

代码语言:javascript
复制
Net::CIDR::range2cidr(Net::CIDR::cidr2range('1.2.3.4/29'));

输出

代码语言:javascript
复制
1.2.3.0/29
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40023914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档