Una limitación que proviene de que los MLDBM y los DBM son atados
es que sólo la escrituras directas del tipo
$db1{one} = { a => 'e' }
produce actualización.
Una escritura indirecta como $db1{one}{a} = 'e'
no produce actualización.
Véase el siguiente ejemplo:
$ cat -n dbwithfilter2.pl 1 #!/usr/bin/perl 2 use warnings; 3 use DB_File; 4 use Data::Dumper; 5 6 unlink 'mldbmtest.dat'; 7 8 $h = tie my %db1, 'DB_File', 'mldbmtest.dat', O_CREAT | O_RDWR, 0666 9 or die "No se pudo inicializar el fichero MLDBM: $!\n"; 10 11 $h->filter_store_value(sub { $_ = Dumper($_) }); 12 $h->filter_fetch_value(sub { $_ = eval($_) }); 13 14 %db1 = ( 15 'one' => { a => 'b' }, 16 'two' => { c => 'd' } 17 ); 18 19 $db1{one}{a} = 'e'; 20 21 $Data::Dumper::Indent = 0; 22 print "Asignacion indirecta:\n",Dumper( \%db1 ),"\n"; 23 24 $db1{one} = { a => 'e' }; 25 26 print "Asignacion directa:\n",Dumper( \%db1 ),"\n";Cuando se ejecuta produce la siguiente salida:
lhp@nereida:~/Lperl/src$ dbwithfilter2.pl Asignacion indirecta: $VAR1 = {'one' => {'a' => 'b'},'two' => {'c' => 'd'}}; Asignacion directa: $VAR1 = {'one' => {'a' => 'e'},'two' => {'c' => 'd'}};
La explicación reside en que al hacer $db1{one}{a} = 'e'
no se produce una llamada a STORE
; de hecho se produce una llamada a FETCH
.
Como no se llama a STORE
no se produce la modificación de la estructura de datos atada.
Casiano Rodríguez León