Recipe 5.7 Retrieving from a Hash in Insertion Order

5.7.1 Problem

The keys and each functions traverse the hash elements in a strange order, and you want them in the order in which you inserted them.

5.7.2 Solution

Use the Tie::IxHash module.

use Tie::IxHash; tie %HASH, "Tie::IxHash"; # manipulate %HASH @keys = keys %HASH;         # @keys is in insertion order

5.7.3 Discussion

Tie::IxHash makes keys, each, and values return the hash elements in the order they were added. This often removes the need to preprocess the hash keys with a complex sort comparison or maintain a distinct array containing the keys in the order they were inserted into the hash.

Tie::IxHash also provides an object-oriented interface to splice, push, pop, shift, unshift, keys, values, and delete, among others.

Here's an example, showing both keys and each:

# initialize use Tie::IxHash; tie %food_color, "Tie::IxHash"; $food_color{"Banana"} = "Yellow"; $food_color{"Apple"}  = "Green"; $food_color{"Lemon"}  = "Yellow"; print "In insertion order, the foods are:\n"; foreach $food (keys %food_color) {     print "  $food\n"; } print "Still in insertion order, the foods' colors are:\n"; while (( $food, $color ) = each %food_color ) {     print "$food is colored $color.\n"; } In insertion order, the foods are:   Banana   Apple   Lemon Still in insertion order, the foods' colors are: Banana is colored Yellow. Apple is colored Green. Lemon is colored Yellow.

5.7.4 See Also

The documentation for the CPAN module Tie::IxHash; Recipe 13.5



Perl Cookbook
Perl Cookbook, Second Edition
ISBN: 0596003137
EAN: 2147483647
Year: 2003
Pages: 501

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net