$distances{$key1}{$key2} = $value; #### obj1 obj2 => 0.95 obj2 obj3 => 0.76 obj1 obj4 => 0.80 ... #### @subsets = ( { obj1 => "C1", obj2 => "C2", obj3 => "C3", obj4 => "C4", obj5 => "C5", } ); #### %used = ( { obj1 => "C1", obj2 => "C2", obj3 => "C3", obj4 => "C4", obj5 => "C5", } ); #### for ($i = 0; $i < 50; $i++) { #loop over array of hashes (each subset will have 50 keys) foreach my $key (keys $subsets[$i]) { #5 keys at each level my $max = 0; my @max; for my $key1 (keys %distances) { if $key !exists (keys %used) { $max = max (values %{$distances{$key1}}); push @max, $max; # somehow retrieve the 2nd key } } my $maxmax = max @max; # $subsets[$i+1]{2nd_key_with_max_val} = "e.g. C1" # push %used with key and value @max = []; } }