sub get_pairs { my %hash = (); $hash{$_}++ foreach @_; my @keys = sort { $hash{$b} <=> $hash{$a} } keys %hash; my $counter = 0; foreach my $x (0..$#keys - 1) { next unless $hash{$keys[$x]}; foreach my $y ($x+1..$#keys) { last unless $hash{$keys[$x]}; next unless $hash{$keys[$y]}; $counter++; print "$counter = ",($keys[$x] < $keys[$y] ? "$keys[$x] $keys[$y]":"$keys[$y] $keys[$x]"),$/; $hash{$keys[$x]}--; $hash{$keys[$y]}--; } } print "$counter counts$/" print "$counter counts$/" print Dumper(\%hash); #to see how many matches are made } get_pairs(@array); __DATA__ 1 = 3 6 2 = 4 6 3 = 1 6 4 = 6 7 5 = 5 6 6 = 6 8 7 = 2 6 8 = 3 4 9 = 1 3 10 = 3 7 11 = 3 5 12 = 3 8 13 = 1 4 14 = 4 7 15 = 4 5 16 = 4 8 17 = 1 7 17 counts $VAR1 = { '6' => 0, '8' => 0, '4' => 0, '1' => 0, '3' => 1, '7' => 0, '2' => 0, '5' => 1 };