2013-08-05 19 views

Odpowiedz

5

Według documentation:

Metoda ta recurses tylko do skrótów, do których odwołuje innym hash. W związku z tym wszystkie skróty Hashów (HoH) będą ograniczone, ale Hash of Arrays of Hashes (HoAoH) będzie miał tylko najwyższy hash ograniczony.

i masz hash tablice mieszań

+0

Ok, jest jakiś inny sposób, aby zablokować te hashe ?? (inne niż Hash :: Util) – trinity

1

Hash::Util sama zapewnia funkcję niskiego poziomu, że można powielać w Perl bez funkcjonalności xs: tj lock_hash/lock_hashref. Pozostała funkcjonalność, której potrzebujesz, jest prostym przejściem i może być łatwo zaimplementowana ręcznie. Przechodź przez zagnieżdżone odniesienia, zachowując listę odwiedzonych i listę znalezionych skrótów, a następnie uruchom pętlę nad znalezioną listą z 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

Istnieje Const::Fast, który umożliwia ustawienie dowolnej zmiennej Perla jako całkowicie tylko do odczytu.

Podczas próby odczytania klucza innego niż prawny, nie uzyska się zachowania "Hash :: czytaj" podczas gry "czytaj dalej".

0

Co z numerem 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"; 

daje

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

Zauważ, że %h3 jest hash, a nie hashref. Hashrefs nie działają dobrze z 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"; 

daje

old value: '1' 
new value: 'New value' 
Powiązane problemy