home | O'Reilly's CD bookshelfs | FreeBSD | Linux | Cisco | Cisco Exam

## 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";
}```

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