diff options
Diffstat (limited to 'contrib/perl5/lib/Tie/RefHash.pm')
-rw-r--r-- | contrib/perl5/lib/Tie/RefHash.pm | 50 |
1 files changed, 44 insertions, 6 deletions
diff --git a/contrib/perl5/lib/Tie/RefHash.pm b/contrib/perl5/lib/Tie/RefHash.pm index ffa9eb20a00c..461148821f59 100644 --- a/contrib/perl5/lib/Tie/RefHash.pm +++ b/contrib/perl5/lib/Tie/RefHash.pm @@ -9,17 +9,26 @@ Tie::RefHash - use references as hash keys require 5.004; use Tie::RefHash; tie HASHVARIABLE, 'Tie::RefHash', LIST; + tie HASHVARIABLE, 'Tie::RefHash::Nestable', LIST; untie HASHVARIABLE; =head1 DESCRIPTION -This module provides the ability to use references as hash keys if -you first C<tie> the hash variable to this module. +This module provides the ability to use references as hash keys if you +first C<tie> the hash variable to this module. Normally, only the +keys of the tied hash itself are preserved as references; to use +references as keys in hashes-of-hashes, use Tie::RefHash::Nestable, +included as part of Tie::RefHash. It is implemented using the standard perl TIEHASH interface. Please see the C<tie> entry in perlfunc(1) and perltie(1) for more information. +The Nestable version works by looking for hash references being stored +and converting them to tied hashes so that they too can have +references as keys. This will happen without warning whenever you +store a reference to one of your own hashes in the tied hash. + =head1 EXAMPLE use Tie::RefHash; @@ -36,6 +45,11 @@ see the C<tie> entry in perlfunc(1) and perltie(1) for more information. print ref($_), "\n"; } + tie %h, 'Tie::RefHash::Nestable'; + $h{$a}->{$b} = 1; + for (keys %h, keys %{$h{$a}}) { + print ref($_), "\n"; + } =head1 AUTHOR @@ -43,7 +57,7 @@ Gurusamy Sarathy gsar@activestate.com =head1 VERSION -Version 1.21 22 Jun 1999 +Version 1.3 8 Apr 2001 =head1 SEE ALSO @@ -51,11 +65,13 @@ perl(1), perlfunc(1), perltie(1) =cut -require 5.003_11; +use v5.6.0; use Tie::Hash; -@ISA = qw(Tie::Hash); use strict; +our @ISA = qw(Tie::Hash); +our $VERSION = '1.3'; + sub TIEHASH { my $c = shift; my $s = []; @@ -68,7 +84,17 @@ sub TIEHASH { sub FETCH { my($s, $k) = @_; - (ref $k) ? $s->[0]{"$k"}[1] : $s->[1]{$k}; + if (ref $k) { + if (defined $s->[0]{"$k"}) { + $s->[0]{"$k"}[1]; + } + else { + undef; + } + } + else { + $s->[1]{$k}; + } } sub STORE { @@ -121,4 +147,16 @@ sub CLEAR { %{$s->[1]} = (); } +package Tie::RefHash::Nestable; +our @ISA = qw(Tie::RefHash); + +sub STORE { + my($s, $k, $v) = @_; + if (ref($v) eq 'HASH' and not tied %$v) { + my @elems = %$v; + tie %$v, ref($s), @elems; + } + $s->SUPER::STORE($k, $v); +} + 1; |