2013-08-05 20 views

回答

5

按照documentation

此方法僅遞歸轉換成由另一種散列引用散列。因此,散列哈希(HoH)將全部受到限制,但哈希陣列(HoAoH)將僅限制最高哈希。

而且你哈希

的陣列
+0

好了,有另一種方式來鎖定這樣的哈希? (除Hash :: Util之外) – trinity

1

Hash::Util本身就提供了你,你可以在Perl沒有複製功能XS低級別功能的哈希:即lock_hash/lock_hashref。您需要的其餘功能是簡單的散列遍歷,並且可以輕鬆地手動實現。遍歷嵌套的引用,同時保留訪問過的列表和發現的散列列表,然後在lock_hashref上運行找到的列表。

2
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 … 
0

Const::Fast,它能夠使任何Perl變量完全只讀。

當您嘗試讀取非法定密鑰時,您將無法獲得Hash :: Util的閱讀模式行爲。

0

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' 
相關問題