use strict; use warnings; my %ips; while () { next if ! /^(\d+)\.(\d+)\.(\d+)\.(\d+)/; push @{$ips{$1}{$2}{$3}}, $4; } my @selected; while (my @picks = pickEm(\%ips)) { push @selected, @picks; } print join "\n", @selected; sub pickEm { my ($root) = @_; return splice @$root, rand(@$root), 1 if 'ARRAY' eq ref $root; my @keys = keys %$root; while (@keys) { my $key = splice @keys, rand(@keys), 1; my $pick = pickEm($root->{$key}); return "$key.$pick" if defined $pick; delete $root->{$key}; } return; } __DATA__ #Group A 184.75.65.68 #Group B 184.75.122.146 184.75.122.147 184.75.122.148 #Group C 64.3.71.98 64.3.71.99 64.3.71.100 64.3.71.106 #Group D 64.3.73.17 64.3.73.18 64.3.73.19 64.3.73.20 #Group E 66.1.73.21 66.1.73.22 66.1.73.23