use warnings; use strict; my %hash= ('a' => {'Size' => 40 }, 'b' => {'Size' => 3000 }, 'c' => {'Size' => 20 }, 'd' => {'Size' => 1 }, 'e' => {'Size' => 12 } ); my @unsort= map ( $hash{$_}->{"Size"} .':' . $_ , keys %hash); no warnings; my @sort= sort {$a<=>$b } @unsort; use warnings; foreach (@sort) { s/[^:]*://; } print join' ',@sort,"\n"; # prints d e c a b