Main Page |
Recipe 5.10 Sorting a Hash5.10.1 ProblemYou need to work with the elements of a hash in a particular order. 5.10.2 SolutionUse keys to get a list of 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 } 5.10.3 DiscussionEven though you can't directly maintain a hash in a specific order (unless you use the Tie::IxHash module mentioned in Recipe 5.7), 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 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"; } 5.10.4 See AlsoThe sort and keys functions in perlfunc(1) and in Chapter 29 of Programming Perl; Recipe 5.7; we discuss sorting lists in Recipe 4.16 |
Main Page |