| Tie-InsertOrderHash documentation | Contained in the Tie-InsertOrderHash distribution. |
Tie::InsertOrderHash - insert-order-preserving tied hash
tie my %hash => 'Tie::InsertOrderHash',
one_two => 'buckle my shoe',
3_4 => 'shut the door',
V_VI => 'pick up sticks';
%hash{7_of_9} => 'not bad';
print "@{[keys %hash]}\n"; # prints keys in order inserted
Tie::InsertOrderHash is a tied hash which preserves the order of inserted keys. Regular perl hashes regurgitate keys in an unspecified order, but at times one wishes to have the properties of both a hash and an array.
As an extention, one may list key/value pairs as additional
arguments to tie, as in the example above.
None.
B. K. Oxley (binkley) <binkley@bigfoot.com>
Tie::Hash provides a skeletal implementation for a tied hash.
perldata explains more about hashes and arrays.
perltie explains more about tying hashes, and describes the
internal subs used to implement them.
tie explains more about how user code tie hashes and the implicit
use of this module.
The DBI module is Copyright (c) 2002 B. K. Oxley (binkley). All rights reserved.
You may distribute under the terms of either the GNU General Public License or the Artistic License, as specified in the Perl README file.
| Tie-InsertOrderHash documentation | Contained in the Tie-InsertOrderHash distribution. |
# # InsertOrderHash.pm - insert-order-preserving tied hash # # $Id$ # package Tie::InsertOrderHash; use v5.6.1; use strict; use warnings; our $VERSION = '0.01'; use base qw(Tie::Hash); sub TIEHASH { my $c = shift; bless [[@_[grep { $_ % 2 == 0 } (0..$#_)]], {@_}, 0], $c } sub STORE { @{$_[0]->[0]} = grep { $_ ne $_[1] } @{$_[0]->[0]}; push @{$_[0]->[0]}, $_[1]; $_[0]->[2] = -1; $_[0]->[1]->{$_[1]} = $_[2] } sub FETCH { $_[0]->[1]->{$_[1]} } sub FIRSTKEY { return wantarray ? () : undef unless exists $_[0]->[0]->[$_[0]->[2] = 0]; my $key = $_[0]->[0]->[0]; return wantarray ? ($key, $_[0]->[1]->{$key}) : $key } # Guard against deletion (see perldoc -f each) sub NEXTKEY { my $i = $_[0]->[2]; return wantarray ? () : undef unless exists $_[0]->[0]->[$i]; if ($_[0]->[0]->[$i] eq $_[1]) { $i = ++$_[0]->[2] ; return wantarray ? () : undef unless exists $_[0]->[0]->[$i]; } my $key = ${$_[0]->[0]}[$i]; return wantarray ? ($key, $_[0]->[1]->{$key}) : $key } sub EXISTS { exists $_[0]->[1]->{$_[1]} } sub DELETE { @{$_[0]->[0]} = grep { $_ ne $_[1] } @{$_[0]->[0]}; delete $_[0]->[1]->{$_[1]} } sub CLEAR { @{$_[0]->[0]} = (); %{$_[0]->[1]} = () } 1; __END__