use strict; use warnings; print map { qq{@{ [ join q{.}, @$_ ] }\n} } map { my @quads = ( $_ ); foreach my $part ( 0 .. 3 ) { foreach my $offset ( reverse 0 .. $#quads ) { next unless $quads[$offset]->[$part] =~ m{(\d+)-(\d+)}; splice @quads, $offset, 1, map { my @quad = @{ $quads[$offset] }; splice @quad, $part, 1, qq{$_}; [ @quad ]; } $1 .. $2; } } @quads; } map { [ ( split m{\.|\s} )[0 .. 3] ] } ; __END__ 172.17.119.2 # Comments are here... 172.17.119.4-5 # Comments are here... 172.19-21.254.2-3 # Comments are here... 192.168.1.1-3 # Comments are here...