La función dbmopen

La función dbmopen nos permite crear hashes persistentes. Veamos el siguiente ejemplo dbm.pl que utiliza un hash DBM para almacenar una gramática:

lhp@nereida:~/Lperl/src$ cat -n dbm.pl
 1  #!/usr/bin/perl -w
 2  use strict;
 3  my %DATA;
 4
 5  dbmopen(%DATA, "my_gramma", 0644) or die "can not create my_gramma $!";
 6  $DATA{TOKENS} = "+|-|/|*|(|)|num";
 7  $DATA{START} = "E";
 8  $DATA{E} = "E+T|E-T";
 9  $DATA{T} = "T*F|T/F";
10  $DATA{F} = "(E)|num";

$DATA{TOKENS} contiene los terminales de la gramática, $DATA{START} el símbolo de arranque y $DATA{A} contiene las reglas de producción de la variable sintáctica A.

Antes de la ejecución de dbm.pl tenemos dos programas Perl dbm.pl y dbm2.pl en nuestro directorio:

>ls -l
-rwxrwx--x    1 pl       users         194 Mar 10 08:44 dbm.pl
-rwxrwx--x    1 pl       users         300 Mar 10 09:54 dbm2.pl

Después de la ejecución de dbm.pl aparecen dos nuevos ficheros que contienen las claves y valores del hash persistente:

>ls -l
-rwxrwx--x    1 pl       users         194 Mar 10 08:44 dbm.pl
-rwxrwx--x    1 pl       users         300 Mar 10 09:54 dbm2.pl
-rw-r-----    2 pl       users       12333 Mar 10 10:54 my_gramma.pag
-rw-r-----    2 pl       users       12333 Mar 10 10:54 my_gramma.dir

Veamos ahora otro programa que usa el hash persistente:

lhp@nereida:~/Lperl/src$ cat -n dbm2.pl
 1  #!/usr/bin/perl -w
 2  use strict;
 3  my %G;
 4  dbmopen(%G, "my_gramma", 0644) or die "can not create my_gramma $!";
 5
 6  my $tokens = $G{TOKENS};
 7  my @tokens = split('\|',$tokens);
 8
 9  print "TOKENS: ";
10  {
11    local $" = ',';
12    print "@tokens\n";
13  }
14
15  my $start = $G{START};
16  print "$start -> $G{$start}\n";
17
18  for my $k (sort keys %G) {
19    print "$k -> $G{$k}\n" if ($k !~ /(START)|(TOKENS)|($start)/);
20  }
Al ejecutarlo obtenemos esta salida:

> dbm2.pl
TOKENS: +,-,/,*,(,),num
E -> E+T|E-T
F -> (E)|num
T -> T*F|T/F

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