You need to work with the elements of a hash in a particular order.
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 }
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
Copyright © 2001 O'Reilly & Associates. All rights reserved.