Perl 复合哈希是否有一个Hash::Util替代方案?

Perl 复合哈希是否有一个Hash::Util替代方案?,perl,hash,hashref,Perl,Hash,Hashref,我有一个复合hashref,如下所示 my $ch = { k1 => [ { k=>1 }, { m=>2 } ], k2 => [ { l=>90}, ... ], }; Hash::Util::lock\u hashref\u recurse($ch)不会有效地锁定这些值 @{$ch->{k1}[0]->{k}='新值'是允许的!如何完全锁定这样的hashref?根据: 此方法仅递归到由另一个哈希引用的哈希中。因此,哈希的散列(HoH)都将受

我有一个复合hashref,如下所示

my $ch = {
    k1 => [ { k=>1 }, { m=>2 } ],
    k2 => [ { l=>90}, ... ],
};
Hash::Util::lock\u hashref\u recurse($ch)
不会有效地锁定这些值

@{$ch->{k1}[0]->{k}='新值'是允许的!如何完全锁定这样的hashref?

根据:

此方法仅递归到由另一个哈希引用的哈希中。因此,哈希的散列(HoH)都将受到限制,但哈希数组的散列(HoAoH)将只限制顶部的散列


您有一个散列数组的散列

Hash::Util
本身为您提供了一个底层函数,您可以在Perl中复制它,而无需XS功能:即
lock\u Hash
/
lock\u hashref
。您需要的其余功能是一个简单的哈希遍历,可以轻松地手动实现。遍历嵌套引用,同时保留访问的引用列表和找到的哈希列表,然后使用
lock\u hashref

在找到的列表上运行循环,这可以使任何Perl变量完全只读

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 …
但是,当您尝试读取非合法密钥时,您不会得到Hash::Util的die-on-read行为。

怎么办

例如

给予

old value: '1'
Modification of a read-only value attempted at readonly.pl line 7
old value: '1'
new value: 'New value'
请注意,
%h3
是哈希,而不是hashref。HashRef不能很好地与Readonly配合使用:

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'
Modification of a read-only value attempted at readonly.pl line 7
old value: '1'
new value: 'New value'

好的,有没有其他方法可以锁定这些散列??(哈希::Util除外)