次のような複合ハッシュリファレンスがあります
my $ch = {
k1 => [ { k=>1 }, { m=>2 } ],
k2 => [ { l=>90}, ... ],
};
Hash::Util::lock_hashref_recurse($ch)
これらの値を効果的にロックしません..
@{$ch->{k1}}[0]->{k} = 'New value';
許可されています !このような hashref を完全にロックするにはどうすればよいですか?
ドキュメントによると:
このメソッドは、別のハッシュによって参照されるハッシュにのみ再帰します。したがって、ハッシュのハッシュ (HoH) はすべて制限されますが、ハッシュの配列のハッシュ (HoAoH) はトップ ハッシュのみが制限されます。
そして、ハッシュの配列のハッシュがあります
Readonlyはどうですか?
例えば
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
はハッシュ参照ではなくハッシュであることに注意してください。ハッシュ参照は読み取り専用ではうまく機能しません:
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'
Const::Fastがあり、Perl 変数を完全に読み取り専用にすることができます。
ただし、合法でないキーを読み取ろうとすると、 Hash::Util のダイオンリード動作は得られません。