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
