use strict;
use Socket;
my $len = '/29';
print "IP IPN Mask Subnet\n";
for my $i (1...31){
print_subnet('192.168.1.'.$i ,$len);
}
sub print_subnet {
my ( $ip, $len ) = @_;
my $ipn = unpack "N", Socket::inet_aton $ip;
$len =~ s/^\///;
my $maskn = 0xFFFFFFFF << ( 32 - $len );
my $subnet_ipn = $ipn & $maskn;
my $subnet_ip = Socket::inet_ntoa pack "N", $subnet_ipn;
printf "%-20s %s %x %s\n","$ip/$len",$ipn,$maskn,$subnet_ip;
}
####
IP IPN Mask Subnet
192.168.1.1/30 3232235777 3fffffffc 192.168.1.0
192.168.1.2/30 3232235778 3fffffffc 192.168.1.0
192.168.1.3/30 3232235779 3fffffffc 192.168.1.0
192.168.1.4/30 3232235780 3fffffffc 192.168.1.4
192.168.1.5/30 3232235781 3fffffffc 192.168.1.4
192.168.1.6/30 3232235782 3fffffffc 192.168.1.4
192.168.1.7/30 3232235783 3fffffffc 192.168.1.4
192.168.1.8/30 3232235784 3fffffffc 192.168.1.8
192.168.1.9/30 3232235785 3fffffffc 192.168.1.8
etc
####
$subnets{"$ip,$len"}{ipn} = $ipn;
$subnets{"$ip,$len"}{maskn} = $maskn;
if ( $subnets{"$ip,$len"}{'comment'} eq '' ){
$subnets{"$ip,$len"}{'comment'} = $comment;
}
####
$subnets{"$ip,$len"} = { ipn => $ipn, maskn => $maskn };
####
print "subnet,prefix,name\n";
print "$_,$subnet{$_}{'comment'}\n"
for sort { $subnets{$a}{ipn} <=> $subnets{$b}{ipn} };