我在网站上找到了一个小功能 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"
但我无法确定它是什么。
答案 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;
}