2012年4月5日星期四

cidr2regexp.pl

$ 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{\.\.}

    }

}

Posted via email from purl's posterous

没有评论: