next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Troceado de un hash Sup: Hashes Ant: Obtener el conjunto de Err: Si hallas una errata ...


Hashes DBM

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:
> cat dbm.pl
#!/usr/bin/perl -w

dbmopen(%DATA, "my_gramma", 0644) or die "can not create my_gramma $!";
$DATA{TOKENS} = "+|-|/|*|(|)|num";
$DATA{START} = "E";
$DATA{E} = "E+T|E-T";
$DATA{T} = "T*F|T/F";
$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:

> cat dbm2.pl
#!/usr/bin/perl -w

dbmopen(%G, "my_gramma", 0644) or die "can not create my_gramma $!";

$tokens = $G{TOKENS};
@tokens = split('\|',$tokens);

print "TOKENS: ";
{
  my $old = $"; 
  $" = ',';
  print "@tokens\n";
  $" = $old;
}

$start = $G{START};
print "$start -> $G{$start}\n";

for my $k (sort keys %G) {
  print "$k -> $G{$k}\n" if ($k !~ /(START)|(TOKENS)|($start)/);
}
Al ejecutarlo obtenemos esta salida:

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


next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Troceado de un hash Sup: Hashes Ant: Obtener el conjunto de Err: Si hallas una errata ...
Casiano Rodríguez León
2006-02-21