>perl -wMstrict -le "my %HoA = ( 2 => ['cd', 20090101, 91010], 3 => ['ef', 20090201, 101000], 1 => ['ab', 20090101, 91010], ); my @ordered_keys = sort { ($HoA{$a}[1]*1000000+$HoA{$a}[2]) <=> ($HoA{$b}[1]*1000000+$HoA{$b}[2]) || $a <=> $b } keys (%HoA); for my $key (@ordered_keys) { print qq{$key -> [@{$HoA{$key}}]} } " 1 -> [ab 20090101 91010] 2 -> [cd 20090101 91010] 3 -> [ef 20090201 101000] #### >perl -wMstrict -le "my %HoA = ( 2 => ['cd', 20090101, 91010], 3 => ['ef', 20090201, 101000], 1 => ['ab', 20090101, 91010], ); my @ordered_keys = sort { $HoA{$a}[1] <=> $HoA{$b}[1] || $HoA{$a}[2] <=> $HoA{$b}[2] || $a <=> $b } keys %HoA; for my $key (@ordered_keys) { print qq{$key -> [@{$HoA{$key}}]} } " 1 -> [ab 20090101 91010] 2 -> [cd 20090101 91010] 3 -> [ef 20090201 101000]