如何使用Perl从IP和子网获取CIDR IP表示法

时间:2016-04-06 09:45:48

标签: perl networking

是否有Perl函数,给定IP地址和子网掩码,可以返回IP所属子网的CIDR表示法?

例如,假设我的IP 192.168.1.23包含子网掩码255.255.255.0,我想获取值192.168.1.0/24

或者如果我192.168.1.23有子网掩码255.255.255.224,我想要192.168.1.0/27,依此类推。

我最终可以建立一个这样做的功能,但我很难相信没有这样做的东西。

2 个答案:

答案 0 :(得分:6)

我建议您使用NetAddr::IP模块。使用所需的IP地址和网络掩码构建对象并在其上调用network方法是一件简单的事情

看起来像这样

use strict;
use warnings 'all';
use feature 'say';

use NetAddr::IP;

say make_cidr(qw/ 192.168.1.23  255.255.255.0 /);
say make_cidr(qw/ 192.168.1.23  255.255.255.224 /);

sub make_cidr {
    my ($addr, $mask) = @_;
    my $net = NetAddr::IP->new($addr, $mask);
    $net->network;
}

输出

192.168.1.0/24
192.168.1.0/27

答案 1 :(得分:4)

如果您需要预先打包的解决方案,可以使用Net::CIDR中的addrandmask2cidr功能。

如果你想自己滚动,基本的算法是计算掩码中的设置位数以获得斜杠后的值(例如,255.255.255.0是11111111.11111111.11111111.00000000二进制,24位设置,因此CIDR / 24)并使用掩码执行地址的逻辑和(&)以获取网络的基址。