use warnings; use Data::Dumper; my $counter = 3; %hash = ( a1_2 => 0.556, a1_3 => 0.345, a2_1 => 0.556, a2_3 => 0.125, a3_1 => 0.345, a3_2 => 0.125, ); print Data::Dumper->Dumpxs([\%hash], [q{*hash}]); for (1 .. $counter) { my @holder = (); my $outer = $_; for (1 .. $counter) { my $inner = $_; if ($outer == $inner) { next; } else { my $tracker = "a$outer\_$inner"; foreach $key (keys %hash) { my $value = $hash{$key}; if ($key eq $tracker) { print "$tracker : $key : $value\n"; push @holder, $value; } } } } @holder_sorted = sort { $a <=> $b } @holder; print "@holder_sorted\n"; # this works to sort the values, but # how do you sort the values while keeping track of the keys? }