1

我在这里的网站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;

并且返回只是更改为“打印” return $netmask;print "$netmask \n" ;

我想这里有问题

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

因为当我打印 $_bit 我只有“255”

但我不知道它是什么。

4

3 回答 3

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 ) );
于 2014-09-02T14:23:03.197 回答
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
于 2014-09-02T17:17:32.250 回答
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;
}   
于 2015-06-15T11:30:38.653 回答