Bloqueo de las Claves de un Hash

El módulo Hash::Util permite bloquear las claves de un hash. Observe la siguiente sesión con el depurador:
pp2@nereida:~/LGRID_Machine$ perl -wde 0
main::(-e:1):   0
  DB<1>  use Hash::Util qw(lock_keys unlock_keys lock_value  unlock_value lock_hash   unlock_hash hash_seed)
  DB<2> %h = (foo => 42, bar => 23)
  DB<3>  lock_keys(%h)
  DB<4> x %h
0  'bar'
1  23
2  'foo'
3  42
  DB<5> $h{chum} = 32
Attempt to access disallowed key 'chum' in a restricted hash at (eval 9)[/usr/share/perl/5.8/perl5db.pl:628] line 2.
La llamada a lock_keys bloque las claves. Sin embargo es posible suprimir claves existentes:
  DB<6> delete($h{foo})
  DB<7> x %h
0  'bar'
1  23
  DB<8> $h{foo} = 5
En el momento del bloqueo es posible especificar que claves se bloquean:

  DB<9> %t = (a => 1, b => 2)
  DB<10> lock_keys(%t, keys(%t), qw{c d e})
  DB<11> @t{qw{c d e}} = 1..3
  DB<12> x %t
0  'e'
1  3
2  'c'
3  1
4  'a'
5  1
6  'b'
7  2
8  'd'
9  2
  DB<13> $t{x} = 4
Attempt to access disallowed key 'x' in a restricted hash at (eval 17)[/usr/share/perl/5.8/perl5db.pl:628] line 2.

Es posible liberar el bloqueo sobre una clave mediante unlock_keys :

  DB<14> unlock_keys(%t)
  DB<15> $t{x} = 4
  DB<16> x %t
0  'e'
1  3
2  'c'
3  1
4  'a'
5  1
6  'b'
7  2
8  'x'
9  4
10  'd'
11  2

Es posible bloquear los valores de un hash cuyas claves hayan sido bloqueadas:

DB<17> %d = qw{one 1 two 2 three 3}
DB<18> lock_keys(%d)
DB<19> lock_value(%d, 'two')
DB<20> $d{one} = 4
DB<21> $d{two} = 3
Modification of a read-only value attempted at (eval 35)[/usr/share/perl/5.8/perl5db.pl:628] line 2.

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19