#!usr/bin/perl -w use strict; #http://perlmonks.org/?node_id=1055552 my %hash = ( key1 => 10, key3 => 3, key2 => 10, key4 => 5, key5 => 10, key6 => 3, ); # The keys don't matter. # What matters is the histogram of the values. my %histo; #histogram of each key's summary data my %pegs; #peg count's of each key #a bit brain boggling, but it works for a sum... #the (my \$value's) are pre-computed at start of the loop # foreach my \$value (values %hash) { \$pegs{\$value}++; \$histo{\$value}+=\$value; } # # various print formats... # print "histo sort by key:\n"; foreach my \$x (sort {\$a <=> \$b} keys %histo) { print "\$x => \$histo{\$x}\n"; } print "\nhisto sort by inverse value:\n"; foreach my \$x (sort {\$histo{\$b} <=> \$histo{\$a}} keys %histo) { print "\$x => \$histo{\$x}\n"; } print "\nPeg counts of values\n"; foreach my \$x (sort {\$pegs{\$a} <=> \$pegs{\$b}} keys %pegs) { print "\$x => \$pegs{\$x}\n"; } =summary of prints: sort by key of sums: 3 => 6 #keys 3,6 5 => 5 #keys 5 10 => 30 #keys 1,2,5 sort by inverse value of sums: (note swap of \$b and \$a) #I did that to make it a bit more interesting... 10 => 30 3 => 6 5 => 5 Peg counts of values: (value and number of times seen) 5 => 1 3 => 2 10 => 3 =cut