Recipe 5.9. Sorting a Hash
Author: Tom Christiansen & Nathan Torkington
Date: 1999-07-02T01:32:46Z

#

| Chapter 5 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

5.8. Inverting a Hash |  | 5.10. Merging Hashes