in reply to Merge CIDRs
use strict; sub cidr2bits { my $cidr = shift; my $n = $cidr =~ s,/(\d+)$, ? $1 : 32; my @n = $cidr =~ m,\d+,g; substr(unpack("B*",pack("C4", @n,0,0,0,0)),0,$n); } sub bits2cidr { my $bits = shift; my $n = length $bits; $bits .= "0" x 8; join(".", unpack("C*", pack("B*",($bits =~ /^((?:.{8})+?)0*$/)[0]))) +."/$n"; } sub mergecidr { local $_ = join("\n", sort map { cidr2bits($_) } @_); 1 while s/^(\d*)\n\1.*$/$1/mg || s/^(\d*)0\n\1.$/$1/mg; map { bits2cidr($_) } (!@_ || length($_)) ? split : ''; }
Update: Swapped the two s/// in the while to prevent the problem merlyn described. Now in the case of
10010 100100 100101
the first two lines will be merged first and yeild the correct result
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Re: Merge CIDRs
by merlyn (Sage) on Oct 13, 2001 at 05:24 UTC |