# Process a line and split out the data into variables my $function = sub { my ($arr) = @_; my ( $ipaddress, $prefix, $ripe, $interface, $device, $location, $comment ) = @$arr; s/^\s+|\s+$//g for ( $ipaddress, $prefix, $interface, $device, $location, $comment ); if ( is_ipv4($ipaddress) ) { store_subnet( $ipaddress, $prefix ) if $prefix; #### # Produce IP subnets from the list of IPs sub store_subnet { my ( $ip, $len ) = @_; my $ipn = unpack "N", Socket::inet_aton $ip; $len =~ s/^\///; my $maskn = 0xFFFFFFFF << ( 32 - $len ); $ipn = $ipn & $maskn; $ip = Socket::inet_ntoa pack "N", $ipn; $subnets{"$ip,$len"} = { ipn => $ipn, maskn => $maskn }; } #### # Print it out print "subnet,prefix\n"; print "$_\n" for sort { $subnets{$a}{ipn} <=> $subnets{$b}{ipn} } keys %subnets; #### sub store_subnet { my ( $ip, $len, $comment ) = @_; my $ipn = unpack "N", Socket::inet_aton $ip; $len =~ s/^\///; my $maskn = 0xFFFFFFFF << ( 32 - $len ); $ipn = $ipn & $maskn; $ip = Socket::inet_ntoa pack "N", $ipn; $subnets{"$ip,$len,$comment"} = { ipn => $ipn, maskn => $maskn, name => $comment }; } #### print "subnet,prefix,name\n"; print "$_\n" for sort { $subnets{$a}{ipn} <=> $subnets{$b}{ipn} } keys %subnets;