use strict; use warnings; use Data::Dumper; use 5.010; use Socket 'inet_aton'; my %ips; my @ranges = qw( 192.168.1.10-192.168.1.20 192.168.1.30-192.168.1.40 ); for my $range ( @ranges ) { my ( $start, $end ) = split /-/, $range; my $range = "$start - $end"; @{ $ips{$range} } = map { sprintf "%vi", pack "N", $_ } unpack("N",inet_aton($start)) .. unpack("N",inet_aton($end)); } print Dumper \%ips; for my $range (keys %ips){ print "Range: $range\n"; print "\t$_\n" for @{ $ips{$range} }; }