aboutsummaryrefslogtreecommitdiff
path: root/contrib/perl5/lib/Tie/RefHash.pm
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/perl5/lib/Tie/RefHash.pm')
-rw-r--r--contrib/perl5/lib/Tie/RefHash.pm50
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;