use strict; use warnings; # Set up hash with prominent marker key/value pairs # and a load of fillers. No 'Foo' yet. # my %hash = ( Bib => 387, Bob => 745, Baz => 106); $hash{$_} = int rand 10 for q{Bea} .. q{Bep}; my @keysOrder = (); my @prefOrder = (); my $key; # Push key and value strings onto array in keys order. # foreach $key (keys %hash) { push @keysOrder, qq{$key => $hash{$key}}; } # Push key and value strings onto another array in # preferred order. # foreach my $key (prefOrder(keys %hash)) { push @prefOrder, qq{$key => $hash{$key}}; } # Print results side by side for comparison. # print qq{\nKey Order Preferred Order\n}; for (0 .. $#keysOrder) { printf qq{%-14s%-14s\n}, $keysOrder[$_], $prefOrder[$_]; } # Add 'Foo' to the hash and repeat test. # $hash{Foo} = 999; @keysOrder = (); @prefOrder = (); foreach $key (keys %hash) { push @keysOrder, qq{$key => $hash{$key}}; } foreach my $key (prefOrder(keys %hash)) { push @prefOrder, qq{$key => $hash{$key}}; } print qq{\nKey Order Preferred Order\n}; for (0 .. $#keysOrder) { printf qq{%-14s%-14s\n}, $keysOrder[$_], $prefOrder[$_]; } sub prefOrder { return map {$_->[0]} sort {$b->[1] <=> $a->[1]} map {[$_, $_ eq q{Foo}]} @_; }