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
