如何使用Perl从IP和子网获取CIDR IP表示法
在给定IP地址和子网掩码的情况下,是否有一个Perl函数可以返回IP所属子网的CIDR表示法 例如,假设我的IP如何使用Perl从IP和子网获取CIDR IP表示法,perl,networking,Perl,Networking,在给定IP地址和子网掩码的情况下,是否有一个Perl函数可以返回IP所属子网的CIDR表示法 例如,假设我的IP192.168.1.23带有子网掩码255.255.255.0,我希望获得值192.168.1.0/24 或者如果我有子网掩码为255.255.255.224的192.168.1.23,我想要192.168.1.0/27,依此类推 我最终可以构建一个这样做的函数,但我发现很难相信现在还没有这样做的东西。如果您想要一个预打包的解决方案,您可以使用来自的addrandmask2cidr函数
192.168.1.23
带有子网掩码255.255.255.0
,我希望获得值192.168.1.0/24
或者如果我有子网掩码为255.255.255.224的192.168.1.23
,我想要192.168.1.0/27
,依此类推
我最终可以构建一个这样做的函数,但我发现很难相信现在还没有这样做的东西。如果您想要一个预打包的解决方案,您可以使用来自的addrandmask2cidr
函数
如果您想自己滚动,基本算法是计算掩码中的设置位数,以获得斜杠后的值(例如,255.255.255.0是11111111.11111111.11111111.00000000,二进制,设置24位,因此为CIDR/24),并执行逻辑and(&
)使用掩码获取网络的基址。我建议您使用该模块。只需构造一个具有所需IP地址和网络掩码的对象,并在其上调用网络
方法即可
看起来像这样
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