$ cidr2regexp.pl 210.212.0.0/11
210\.((19[2-9])|(20[0-9])|(21[0-9])|(22[0-3]))
$ cidr2regexp.pl 210.212.0.0/12
210\.((20[8-9])|(21[0-9])|(22[0-3]))
$ cidr2regexp.pl 210.212.0.0/13
210\.((20[8-9])|(21[0-5]))
#!/usr/bin/perl -l
BEGIN{ ($ip,$bits)=split q(\/), shift }
$bin_str=substr( (join qq(), map { sprintf q(%08b), $_ } split (q(\.), $ip)), 0, $bits);
push @eight_bins, $1 while $bin_str=~m{(.{1,8})}g;
@ddd = map {
if (length($_) == 8) { eval qq(0b$_) }
else {
qq(@{[eval qq(0b@{[substr($_.q(0)x8,0,8)]})]} .. @{[eval qq(0b@{[substr($_.q(1)x8,0,8)]})]})
}
} @eight_bins;
END {
do { @digits=split q(), $_; $seen{join q(), @digits[0..$#digits-1]}.=$digits[-1] }
for eval qq( @{[grep { m{\.\.} } @ddd]} );
print join qq(\\\.), (grep { !m{\.\.} } @ddd ),
eval {
q{(}.
(
join qq(\|),
map {qq(($_\[@{[substr($seen{$_},0,1)]}-@{[substr($seen{$_},-1,1)]}]))}
sort {$a<=>$b} keys %seen
)
.q{)}
if $ddd[-1]=~m{\.\.}
}
}
没有评论:
发表评论