sub mask_short_to_long1 { my @octets = unpack "C4", pack "V", 2 ** $_[0] -1 ; @octets = map {unpack "C", pack "b8", sprintf "%08b", $_} @oct +ets; return join '.', @octets; }
Or, this for Perl versions before 5.6.0 (i.e., without "%b"):
Or, a more direct approach:sub mask_short_to_long2 { my @octets = unpack "b8b8b8b8", pack "V", 2 ** $_[0] -1 ; @octets = map {ord pack "B8", $_} @octets; return join '.', @octets; }
sub mask_short_to_long3 { my $mask = shift; my @octets = (0,0,0,0); for (@octets) { $_ = $mask > 8 ? 255 : 256 - 2**(8-$mask); $mask = $mask > 8 ? $mask -8 : 0; } join '.', @octets; }
It is a little bit long for a one-liner but since you asked: perl -le'print+join".",map{ord pack"B8",$_}unpack"b8"x4,pack"V",-1+2**pop' num
--
John.
In reply to Re: Shorter code ?
by jmcnamara
in thread Shorter code ?
by zejames
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |