in reply to Shorter code ?


How about something like this:
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"):

sub mask_short_to_long2 { my @octets = unpack "b8b8b8b8", pack "V", 2 ** $_[0] -1 ; @octets = map {ord pack "B8", $_} @octets; return join '.', @octets; }
Or, a more direct approach:
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.

Replies are listed 'Best First'.
Re: Re: Shorter code ?
by zejames (Hermit) on Mar 11, 2002 at 15:16 UTC
    Whow !!! Thanks !!

    That is why I love perl...

    zejames