• Publicidad

Hash de hash

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Hash de hash

Notapor tyranus » 2009-09-13 11:21 @515

Hola, comunidad de Perl en Español. Soy nuevo en el foro y ando complicado con el tema de hash de hashs.

Crearlos es sencillo pero leerlos no termino de comprender... tal vez esté haciendo todo mal.

A ver...

Tengo esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "Nombre de la carpeta: ";
  2. $carpeta = <STDIN>;
  3. chomp($carpeta);
  4. opendir(DIR,$carpeta) || die "Error al abrir la carpeta.";
  5. readdir(DIR);
  6. readdir(DIR);
  7. while( $file=readdir(DIR)) {
  8.         open(F,"$carpeta\\$file") || die "archivo no encontrado";
  9.         while ( $linea=<F> ) {
  10.                 chomp($linea);
  11.                 @palabras = split(" ",$linea);
  12.                 foreach $clave (@palabras) {
  13.                         $terminos{$file}{$clave}+=1;
  14.                 };
  15.         };
  16.         close(F);
  17. };
  18. print "Va a imprimir el hash de hashes \n";
  19. while ( my ($key, $value) = each(%terminos) ) {
  20.         print "Archivo: $key \n"; # el problema está en que no sé recuperar los valores
  21.         foreach $key2 (keys %value) {
  22.                 print $key2;
  23.                 print "$value{%key2} \n";
  24.         };
  25. };
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Seguramente estoy haciendo varias cosas mal en la lectura.
Porque en $value termina habiendo un hash pero no puedo sacar los valores de allí.
Hace 2 o 3 días que empecé con Perl, sean comprensivos.

Espero se me entienda lo que quise preguntar.

¡Muchas gracias desde ya!

Un saludo.
tyranus
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2009-09-13 11:09 @506

Publicidad

Re: Hash de hash

Notapor explorer » 2009-09-13 12:04 @544

Bienvenido a los foros de Perl en Español, tyranus.

En la línea 21 haces referencia a la variable hash %value, pero esa variable no la has definido en ningún sitio. Habrás querido decir %$value, es decir, $value contiene una referencia al hash correspondiente a la clave $key, que ha devuelto each().

Y en la línea 23 vuelves a hacer referencia a esa variable desconocida, %value, además de otra nueva: %keys. Seguramente querrás decir $value->{$key2}.

Más detalles: no es necesario poner ';' detrás de las llaves, excepto en un par de casos.

El acceso al contenido de los hash se puede realizar de varias maneras, como te pongo aquí, en el último print():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my %terminos = (
  7.     fichero1 => {
  8.                     La    => 2,
  9.                     casa  => 1,
  10.                     de    => 12,
  11.                     omega => 6,
  12.                 },
  13.     fichero2 => {
  14.                     Los   => 1,
  15.                     los   => 1,
  16.                     tres  => 2,
  17.                     de    => 9,
  18.                     alfa  => 1,
  19.                 },
  20. );
  21.  
  22.  
  23. use Data::Dumper;
  24. print Dumper \%terminos;
  25.  
  26. print "Va a imprimir el hash de hashes \n";
  27.  
  28. while (my ($fichero, $palabras_del_fichero) = each(%terminos) ) {
  29.     print "Archivo: $fichero\n";
  30.     foreach my $palabra (keys %$palabras_del_fichero) {
  31.         print "$palabra => $terminos{$fichero}{$palabra} | $palabras_del_fichero->{$palabra}\n";
  32.     }
  33. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Recuerda también que el módulo Data::Dumper es tu amigo.

Aquí te lo pongo de otra manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my %ficheros = (
  7.     fichero1 => {
  8.                     La    => 2,
  9.                     casa  => 1,
  10.                     de    => 12,
  11.                     omega => 6,
  12.                 },
  13.     fichero2 => {
  14.                     Los   => 1,
  15.                     los   => 1,
  16.                     tres  => 2,
  17.                     de    => 9,
  18.                     alfa  => 1,
  19.                 },
  20. );
  21.  
  22.  
  23. for my $fichero (keys %ficheros) {
  24.     print "Archivo: $fichero\n";
  25.  
  26.     for my $palabra (keys %{$ficheros{$fichero}}) {
  27.         print "$palabra  => $ficheros{$fichero}{$palabra}\n";
  28.     }
  29. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Digamos que el acceso es casi igual que en otros lenguajes, como el C. Sólo hay que seguir de forma correcta la sintaxis. Lo bueno de Perl es que permite hacerlo de más de una forma.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Hash de hash

Notapor tyranus » 2009-09-13 12:14 @551

¡Muchas gracias, explorer! Por la bienvenida y por la explicación, ha quedado todo muy claro. :D
tyranus
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2009-09-13 11:09 @506


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron