for my $id ( sort_hoh \%hash, age => 'ASC' ) { # ... } sub sort_hoh { my ( $hoh, $key, $dir ) = @_; my @dir = $dir eq 'DESC' ? ( 1, 0 ) : ( 0, 1 ); sort { my ( $_a, $_b ) = map $_->{ $key }, @{ $hoh }{ ( $a, $b )[ @dir ] }; $_a <=> $_b || $_a cmp $_b; } keys %$hoh; }