5

次のような複合ハッシュリファレンスがあります

my $ch = {
    k1 => [ { k=>1 }, { m=>2 } ],
    k2 => [ { l=>90}, ... ],
};

Hash::Util::lock_hashref_recurse($ch)これらの値を効果的にロックしません..

@{$ch->{k1}}[0]->{k} = 'New value';許可されています !このような hashref を完全にロックするにはどうすればよいですか?

4

5 に答える 5

5

ドキュメントによると:

このメソッドは、別のハッシュによって参照されるハッシュにのみ再帰します。したがって、ハッシュのハッシュ (HoH) はすべて制限されますが、ハッシュの配列のハッシュ (HoAoH) はトップ ハッシュのみが制限されます。

そして、ハッシュの配列のハッシュがあります

于 2013-08-05T11:36:03.977 に答える
0

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'
于 2013-12-25T06:24:18.197 に答える
0

Const::Fastがあり、Perl 変数を完全に読み取り専用にすることができます。

ただし、合法でないキーを読み取ろうとすると、 Hash::Util のダイオンリード動作は得られません。

于 2013-08-05T15:02:48.150 に答える