, , tie, . ,
tie, Tie::StdHash
Tie::StdHash, . , , ,
TIEHASH, , tie, FETCH, FETCH, , , ,
, , . , , , -. -
SpecialHash.pm
package SpecialHash;
use Tie::Hash;
use base 'Tie::StdHash';
sub TIEHASH {
my $class = shift;
bless { @_ }, $class;
}
sub FETCH {
my $self = shift;
my $val = $self->SUPER::FETCH(@_);
ref $val eq 'CODE' ? $val->() : $val;
}
1;
main.pl
use strict;
use warnings 'all';
use SpecialHash;
tie my %hash, SpecialHash => (
key1 => "value1",
key2 => sub {
return "value2";
},
);
print "$hash{$_}\n" for sort keys %hash;
value1
value2
Update
, , .
my %hash = (
a => {
key_a1 => 'value_a1',
key_a2 => sub { 'value_a2' },
},
b => {
key_b1 => sub { 'value_b1' },
key_b2 => 'value_b2',
},
);
tie , , , , . , TIEHASH SpecialHash, tie
, tie ,
%hash, -.
tie %$val, SpecialHash => ( %$val )
tie my %hash, SpecialHash => ( ... )
, $val, , .
, %hash, ,
use strict;
use warnings 'all';
use SpecialHash;
my %hash = (
a => {
key_a1 => 'value_a1',
key_a2 => sub { 'value_a2' },
},
b => {
key_b1 => sub { 'value_b1' },
key_b2 => 'value_b2',
},
);
for my $val ( values %hash ) {
tie %$val, SpecialHash => ( %$val ) if ref $val eq 'HASH';
}
for my $k ( sort keys %hash ) {
my $v = $hash{$k};
next unless ref $v eq 'HASH';
print "$k =>\n";
for my $kk ( sort keys %$v ) {
my $vv = $v->{$kk};
print " $kk => $v->{$kk}\n"
}
}
a =>
key_a1 => value_a1
key_a2 => value_a2
b =>
key_b1 => value_b1
key_b2 => value_b2