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