Limitaciones

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