summaryrefslogtreecommitdiff
path: root/lib/Tie
diff options
context:
space:
mode:
authorEdward Avis <ed@membled.com>2000-11-02 15:24:30 +0000
committerJarkko Hietaniemi <jhi@iki.fi>2000-11-02 15:48:37 +0000
commit778e8f972dad7252816055b155a64294366d7232 (patch)
treef0dc737fa41323de3ee7693936318eea26b55b46 /lib/Tie
parent632a9a7f3319d143cc62cb1495c02ec868a6dc88 (diff)
downloadperl-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.pm42
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;