Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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和子网获取CIDR IP表示法_Perl_Networking - Fatal编程技术网

如何使用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函数

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

例如,假设我的IP
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