#! perl -slw use strict; use Data::Dumper; sub rndStr{ join'', @_[ map{ rand $#_ } 1 .. shift ] } my %hash = map { $_ => { name => rndStr( 10, 'a'..'z' ), age => int 18+rand 80, sex => ( 'M', 'F', 'U' )[ rand 3 ], } } 1000001 .. 1000010; for my $orderBy ( qw[ name age sex ] ) { my $dir = ( qw[ ASC DESC ] )[ rand 2 ]; ## Just one, inline sort block with dereferencing only done once. my @sorted = sort{ local $^W; $a <=> $b || $a cmp $b } map{ $_->{$orderBy} } values %hash; ## Reverse if need be @sorted = reverse @sorted if $dir eq 'DESC'; ## And display print "\n$orderBy $dir"; print for @sorted } __END__ P:\test>498186 name ASC bbfxkykvpk bmhymyxlbm fcqxfmqtpc gbwvxqdecg glqaexowct ixptsmdruw kijumgktwv mpnnmcncjt porblnobmp uiwodoxvqo age DESC 90 76 76 58 48 47 45 35 26 22 sex DESC U U U U U U U M F F