start page | rating of books | rating of authors | reviews | copyrights

Perl Cookbook

Perl CookbookSearch this book
Previous: 5.8. Inverting a Hash Chapter 5
Hashes
Next: 5.10. Merging Hashes
 

5.9. Sorting a Hash

Problem

You need to work with the elements of a hash in a particular order.

Solution

Use keys to get a list of the keys, then sort them based on the ordering you want:

# %HASH is the hash to sort @keys = sort { criterion() } (keys %hash); foreach $key (@keys) {     $value = $hash{$key};     # do something with $key, $value }

Discussion

Even though you can't directly maintain a hash in a specific order (unless you use the Tie::IxHash module mentioned in Recipe 5.6 ), you can access its entries in any order.

This technique offers many variations on the same basic mechanism: You extract the keys, reorder them using the sort function, and then process the entries in the new order. All the sorting tricks shown in Chapter 4, Arrays , can be used here. Let's look at some applications.

The following code simply uses sort to order the keys alphabetically:

foreach $food (sort keys %food_color) {     print "$food is $food_color{$food}.\n"; }

This sorts the keys by their associated values:

foreach $food (sort { $food_color{$a} cmp $food_color{$b} }                 keys %food_color)  {     print "$food is $food_color{$food}.\n"; }

This sorts by length of the values:

@foods = sort { length($food_color{$a}) <=> length($food_color{$b}) }      keys %food_color; foreach $food (@foods) {     print "$food is $food_color{$food}.\n"; }

See Also

The sort and keys functions in perlfunc (1) and in Chapter 3 of Programming Perl ; Recipe 5.6 ; we discuss sorting lists in Recipe 4.15


Previous: 5.8. Inverting a Hash Perl Cookbook Next: 5.10. Merging Hashes
5.8. Inverting a Hash Book Index 5.10. Merging Hashes