use strict; use warnings; sub pack_ipv4 { my $dotted_ip = @_ ? $_[0] : $_; return pack('C4', split(/\./, $dotted_ip)); } sub unpack_ipv4 { my $packed_ip = @_ ? $_[0] : $_; return join('.', unpack('C4', $packed_ip)); } sub get_subnet { my ($packed_ip, $subnet_size) = @_; my $packed_mask = pack('B32', ('1' x $subnet_size) . ('0' x (32-$subnet_size))); return $packed_ip & $packed_mask; } my %hashIPs = map { $_ => 1 } ( (map { "10.0.0.$_" } 0..255), (map { "10.0.1.$_" } 0..254), (map { "10.0.2.$_" } 0..255), ); my %count; for (keys %hashIPs) { ++$count{get_subnet(pack_ipv4($_), 24)}; } for (grep { $count{$_} == 256 } keys %count) { print(unpack_ipv4($_), "/24\n"); } #### my %count; print("$_/24\n") for map unpack_ipv4, grep ++$count{$_} == 256, map get_subnet($_, 24), map pack_ipv4, keys %hashIPs;