我有一種化合物hashref如下是否存在用於複合散列的Hash :: Util替代方案?
my $ch = {
k1 => [ { k=>1 }, { m=>2 } ],
k2 => [ { l=>90}, ... ],
};
Hash::Util::lock_hashref_recurse($ch)
沒有有效地將這些值鎖定..
@{$ch->{k1}}[0]->{k} = 'New value';
允許!我如何完全鎖定這樣的hashref?
我有一種化合物hashref如下是否存在用於複合散列的Hash :: Util替代方案?
my $ch = {
k1 => [ { k=>1 }, { m=>2 } ],
k2 => [ { l=>90}, ... ],
};
Hash::Util::lock_hashref_recurse($ch)
沒有有效地將這些值鎖定..
@{$ch->{k1}}[0]->{k} = 'New value';
允許!我如何完全鎖定這樣的hashref?
Hash::Util
本身就提供了你,你可以在Perl沒有複製功能XS低級別功能的哈希:即lock_hash
/lock_hashref
。您需要的其餘功能是簡單的散列遍歷,並且可以輕鬆地手動實現。遍歷嵌套的引用,同時保留訪問過的列表和發現的散列列表,然後在lock_hashref
上運行找到的列表。
use strictures;
use Hash::Util qw(lock_hash);
use Data::Visitor::Callback qw();
my $ch = {
k1 => [{k => 1}, {m => 2}],
k2 => [{l => 90},],
};
Data::Visitor::Callback->new(
hash => sub {
lock_hash %{ $_ };
return $_;
}
)->visit($ch);
$ch->{k1}[0]{k} = 'New value';
__END__
Modification of a read-only value attempted at …
有Const::Fast,它能夠使任何Perl變量完全只讀。
當您嘗試讀取非法定密鑰時,您將無法獲得Hash :: Util的閱讀模式行爲。
Readonly怎麼樣?
E.g.
use Readonly;
Readonly my %h3 => (
k1 => [ { k=>1 }, { m=>2 } ],
k2 => [ { l=>90}, ],
);
print "old value: '$h3{k1}->[0]->{k}'\n";
$h3{k1}->[0]->{k} = 'New value';
print "new value: '$h3{k1}->[0]->{k}'\n";
給
old value: '1'
Modification of a read-only value attempted at readonly.pl line 7
注意%h3
是一個哈希,而不是一個hashref。 Hashrefs不只讀很好地工作:
use Readonly;
Readonly my $h2 => {
k1 => [ { k=>1 }, { m=>2 } ],
k2 => [ { l=>90}, ],
};
print "old value: '$h2->{k1}->[0]->{k}'\n";
$h2->{k1}->[0]->{k} = 'New value';
print "new value: '$h2->{k1}->[0]->{k}'\n";
給
old value: '1'
new value: 'New value'
好了,有另一種方式來鎖定這樣的哈希? (除Hash :: Util之外) – trinity