####
_END__
Output:
Before test test ...
After test changed ...
##
##
##
##
#!/usr/bin/env perl
package MagicHash;
require Tie::Hash;
our @ISA = qw(Tie::Hash);
sub TIEHASH { bless {}, shift }
sub STORE {
my ($self, $key, $newval) = @_;
$self->{$key} = {key=>$key, value=>[$newval,$$newval]};
}
sub FIRSTKEY {
my ($self) = @_;
keys %{$self};
my $first_key = each %{$self};
return undef unless defined $first_key;
return $self->{$first_key}->{key};
}
sub FETCH {
my ($self, $key) = @_;
my ($is_ref) = $key =~ s/^\\//;
return $is_ref
? $self->{$key}->{value}->[0]
: $self->{$key}->{value}->[1]
;
}
sub NEXTKEY {
my ($self, $nextkey) = @_;
my $next_key = each %{$self};
return undef unless defined $next_key;
return $self->{$next_key}->{key};
}
package main;
use strict;
use warnings;
use Data::Dumper;
{
my $test = 'test';
my $changed = 'changed';
my %hash = ( t => \$test );
print "Before: \$test = $test\n", Dumper \%hash;
${ $hash{t} } = 'changed';
print " After: \$test = $test\n", Dumper \%hash;
}
{
my $test = 'test';
my $changed = 'changed';
tie my %hash, 'MagicHash';
%hash = ( t => \$test );
print "Tied Before: \$test = $test\n", Dumper \%hash;
${ $hash{'\t'} } = 'changed';
print "Tied After1: \$test = $test\n", Dumper \%hash;
${ $hash{'\t'} } = 'again';
print "Tied After2: \$test = $test\n", Dumper \%hash;
$hash{'t'} = \'one more';
print "Tied After3: \$test = $test\n", Dumper \%hash;
}