Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用perl IP库在一系列IP上循环_Perl_Ipv4 - Fatal编程技术网

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

使用perl IP库在一系列IP上循环,perl,ipv4,Perl,Ipv4,我正在尝试创建一个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

我正在尝试创建一个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.x.x.0/24网络,适用于1.2.3.4/32,但当我使用1.2.3.4/29时,循环就消失了。我认为这可能是因为没有使用IP地址,但该范围内有4个IP处于活动状态。

这不起作用的原因是模块要求您发送正确的网络地址作为给定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());

这不起作用的原因是,模块要求您发送一个正确的网络地址作为给定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());

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

下面是一个使用您的测试数据
1.2.3.4/29
作为范围的示例

使用严格;
使用“全部”警告;
使用特征“说”;
使用Net::CIDR;
my@range=Net::CIDR::CIDR2八位字节('1.2.3.4/29');
表示@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/29

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

下面是一个使用您的测试数据
1.2.3.4/29
作为范围的示例

使用严格;
使用“全部”警告;
使用特征“说”;
使用Net::CIDR;
my@range=Net::CIDR::CIDR2八位字节('1.2.3.4/29');
表示@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/29

您应该使用
my$ip=Net::ip->new($range)或die
而不是
my$ip=new Net::ip($range)|die。间接对象表示法很旧,不推荐使用,左边的
|
非常粘。另外,do
die$
以查看其死亡原因。
1.2.3.4/29
不是有效的IP范围。<代码> 4 在“代码> / 29 前缀”的中间掉落DAB。code>1.2.3.0/29
将是有效的“范围”。@simbabque不幸的是,此模块仅使用
模具。它不会返回或显示任何关于它死亡原因的信息。@stevieb,如果你阅读了精细手册,你会看到正确的用法是
my$ip=new Net::ip('193.0.1/24')或die(Net::ip::Error())
实际上返回构造函数失败的确切原因。您应该使用
my$ip=Net::ip->new($range)或die
而不是
my$ip=new Net::ip($range)|die。间接对象表示法很旧,不推荐使用,左边的
|
非常粘。另外,do
die$
以查看其死亡原因。
1.2.3.4/29
不是有效的IP范围。<代码> 4 在“代码> / 29 前缀”的中间掉落DAB。code>1.2.3.0/29
将是有效的“范围”。@simbabque不幸的是,此模块仅使用
模具。它不会返回或显示任何关于它死亡原因的信息。@stevieb,如果你阅读了精细手册,你会看到正确的用法是
my$ip=new Net::ip('193.0.1/24')或die(Net::ip::Error()),实际上,它返回了构造函数失败的确切原因。我刚刚将您的答案改为使用直接对象表示法。如果您不喜欢,请随时回滚我的编辑。@PerlDog-nah我打算放弃它,我考虑过这样做(我是用直接表示法测试的),但按照文档中几乎一字不差的说明进行测试。谢谢你的更新。我刚把你的答案改成使用直接对象表示法。如果您不喜欢,请随时回滚我的编辑。@PerlDog-nah我打算放弃它,我考虑过这样做(我是用直接表示法测试的),但按照文档中几乎一字不差的说明进行测试。谢谢你的更新。看起来很有希望!唯一奇怪的是,a/24的输出不是.0-.255,而是1.2.3。其他子网掩码看起来不错,看起来很有希望!唯一奇怪的是,a/24的输出不是.0-.255,而是1.2.3。其他子网掩码看起来不错