2013-08-05 7 views

Antwort

5

Nach den documentation:

Diese Methode recurses nur in Hashes, die von einem anderen Hash referenziert werden. So wird ein Hash of Hashes (HoH) eingeschränkt, aber ein Hash of Array of Hashes (HoAoH) wird nur das Top Hash enthalten.

Und Sie haben einen Hash von Arrays von Hashes

+0

Okay, gibt es eine andere Möglichkeit, solche Hashes zu sperren ?? (außer Hash :: Util) – trinity

1

Hash::Util selbst bietet Ihnen eine Low-Level-Funktion, die Sie in Perl ohne XS Funktionalität replizieren kann: das heißt lock_hash/lock_hashref. Der Rest der Funktionalität, die Sie benötigen, ist eine einfache Hash-Traversierung und kann einfach manuell implementiert werden. Durchqueren Sie verschachtelte Referenzen, halten Sie die Liste der besuchten Referenzen und die Liste der gefundenen Hashes und führen Sie dann eine Schleife über diese Liste mit 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

Es gibt Const::Fast, das jede Perl-Variable vollständig schreibgeschützt machen kann.

Wenn Sie versuchen, einen nicht-legalen Schlüssel zu lesen, erhalten Sie nicht das Die-auf-lesen-Verhalten von Hash :: Util.

0

Was ist mit Readonly?

z.

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"; 

gibt

old value: '1' 
Modification of a read-only value attempted at readonly.pl line 7 

Beachten Sie, dass %h3 ein Hash ist, kein hashref. Hashrefs funktionieren nicht gut mit Read-only:

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"; 

gibt

old value: '1' 
new value: 'New value' 
Verwandte Themen