diff options
author | Edward Avis <ed@membled.com> | 2000-11-02 15:24:30 +0000 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 2000-11-02 15:48:37 +0000 |
commit | 778e8f972dad7252816055b155a64294366d7232 (patch) | |
tree | f0dc737fa41323de3ee7693936318eea26b55b46 /lib/Tie | |
parent | 632a9a7f3319d143cc62cb1495c02ec868a6dc88 (diff) | |
download | perl-778e8f972dad7252816055b155a64294366d7232.tar.gz |
Add Tie::RefHash::Nestable (lives in Tie/RefHash.pm),
fix a autovivification bug in Tie::RefHash, add tests for both.
Subject: Re: Tie::RefHash: use hash refs as keys in nested hashes
Message-ID: <Pine.LNX.4.21.0011021516010.8344-100000@texel03.doc.ic.ac.uk>
p4raw-id: //depot/perl@7527
Diffstat (limited to 'lib/Tie')
-rw-r--r-- | lib/Tie/RefHash.pm | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/lib/Tie/RefHash.pm b/lib/Tie/RefHash.pm index ffa9eb20a0..d4111d92e5 100644 --- a/lib/Tie/RefHash.pm +++ b/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::Hash. 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 @@ -68,7 +82,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 +145,16 @@ sub CLEAR { %{$s->[1]} = (); } +package Tie::RefHash::Nestable; +use vars '@ISA'; @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; |