Perl从CIDR计算网络掩码

时间:2014-09-02 14:14:48

标签: perl subnet cidr netmask

我在网站上找到了一个小功能 http://jmorano.moretrix.com/2010/08/calculate-netmask-in-perl 我正在使用它,但它并没有产生与他相同的东西。

我将CIDR地址放在这样的变量中:

126.126.126.250/24

该函数应返回类似的内容 255.255.255.0 但相反,它会返回

0.0.0.255

我在函数中修改的唯一内容是

my($network, $netbit) = split ///, $subnet;

my($network, $netbit) = split /\//, $subnet;

并且返回仅更改为" print" return $netmask;print "$netmask \n" ;

我猜这里有什么问题

    my $_bit         = ( 2 ** (32 - $netbit) ) - 1;

因为当我打印$ _bit时,我只有" 255"

但我无法确定它是什么。

3 个答案:

答案 0 :(得分:4)

还需要一个反斜杠,

my ($full_mask)  = unpack( "N", pack( "C4", split(/\./, '255.255.255.255') ) );
                                                   ^

虽然它会更有意义

my ($full_mask)  = unpack( "N", pack( "C4", 255,255,255,255 ) );

my ($full_mask)  = unpack( "N", pack( "C4", (255) x4 ) );

答案 1 :(得分:3)

不要编写自己的函数,而是考虑使用像Net::Netmask这样的现有模块:

use strict;
use warnings;
use 5.010;

use Net::Netmask;

my $cidr = '126.126.126.250/24';
my $block = Net::Netmask->new2( $cidr ) or die $Net::Netmask::error;
say $block->mask;

输出:

255.255.255.0

答案 2 :(得分:3)

问题中链接的一个较小的替代方案:

sub _smaller_calc_netmask {
    my($subnet) = @_;

    # e.g.: 10.0.0.0/24 192.168.1.0/16
    my($network, $netbit) = split m'/', $subnet; # quote as match delimiter hack  

    # Decimal representation of mask
    my $mask  = (2 ** $netbit - 1) << (32 - $netbit); 

    # convert decimal representation to our familiar form
    my $netmask = join( '.', unpack( "C4", pack( "N", $mask ) ) );

    return $netmask;
}