Tie::InsertOrderHash - insert-order-preserving tied hash


Tie-InsertOrderHash documentation Contained in the Tie-InsertOrderHash distribution.

Index


Code Index:

NAME

Top

Tie::InsertOrderHash - insert-order-preserving tied hash

SYNOPSIS

Top

  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

DESCRIPTION

Top

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.

EXPORT

None.

AUTHOR

Top

B. K. Oxley (binkley) <binkley@bigfoot.com>

SEE ALSO

Top

Tie::Hash

Tie::Hash provides a skeletal implementation for a tied hash.

perldata

perldata explains more about hashes and arrays.

perltie

perltie explains more about tying hashes, and describes the internal subs used to implement them.

tie in perlfunc

tie explains more about how user code tie hashes and the implicit use of this module.

COPYRIGHT

Top


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__