use constant MAXIP => 2**(8*4)-1; sub quad2num { my $num = 0; my @bytes = split('\.', shift); map { $num = 256 * $num + $_ } @bytes; die "IP number $num out of range" unless ($num >= 0 and $num <= MAXIP); return $num; } sub num2quad { my $num = shift; my @bytes = (); return $num if $num =~ /^\d+\.\d+\.\d+\.\d+$/; unless ($num >= 0 and $num <= MAXIP) { warn "IP number $num out of range 0..$maxip"; return undef } foreach (1..4) { unshift @bytes, $num % 256; $num >>= 8; # $num /= 2**8; } return join('.',@bytes); }