• Publicidad

Crear un hash desde un fichero de palabras

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

Crear un hash desde un fichero de palabras

Notapor boteropepe » 2010-03-08 15:38 @693

Hola, no soy informático, así que agradezco cualquier ayuda, sea como sea.

Tengo un fichero con líneas como estas:

casa maison caballo horse amarillo amarelo ducha doccia

De momento, solo necesito tomar las palabras en español, que siempre están en una posición correspondiente a un número impar.

He pensado agrupar las palabras por parejas en un hash (me puede venir bien mantener la palabra extranjera asociada a cada caso), pero realmente no sé cómo aprovechar la información de la posición que ocupa cada palabra (par-impar) para crear los pares.

Como ya he dicho, soy muy muy novato, por lo que cualquier "pista" que puedan darme me servirá. Muchas gracias.
boteropepe
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-03-08 15:14 @676

Publicidad

Re: Crear un hash desde un fichero de palabras

Notapor explorer » 2010-03-08 15:57 @706

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

Lo que puedes hacer es abrir el fichero, leerlo línea a línea, en cada línea separar las palabras, y agruparlas por pares dentro de un hash.

Algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my %hash;
  4.  
  5. open my $FICHERO, q[<], 'fichero_palabras.txt';  # abrimos el fichero
  6.  
  7. while (my $linea = <$FICHERO>) {                 # para todas las líneas del fichero
  8.     chomp $linea;                                # quitamos el carácter de fin de línea
  9.  
  10.     my @palabras = split " ", $linea;            # separamos las palabras por sus espacios
  11.  
  12.     for (my $i = 0; $i < @palabras; $i += 2) {   # para todos los pares de palabras
  13.  
  14.         $hash{$palabras[$i]} = $palabras[$i+1];  # guardamos la relación $palabra1 => $palabra2
  15.     }
  16. }
  17.  
  18. close $FICHERO;                                  # cerramos fichero
  19.  
  20. use Data::Dumper;
  21. print Dumper \%hash;                             # vemos el contenido
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

La salida es
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$VAR1 = {
          'casa' => 'maison',
          'amarillo' => 'amarelo',
          'caballo' => 'horse',
          'ducha' => 'doccia'
        };
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
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: Crear un hash desde un fichero de palabras

Notapor erv-Z » 2010-03-08 16:13 @717

Tremendo, explorer, muy buen código, aunque no me manejo mucho con los hash xD.
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Re: Crear un hash desde un fichero de palabras

Notapor boteropepe » 2010-03-09 04:21 @223

¡¡Muchas gracias!!

Entre otros de los muchos problemas que tengo, está el de no conocer bien la sintaxis; había llegado a la idea de hacer un 'for', pero en vez de '$i < @lista ' había hecho '$i < $_', y aparte de eso, tampoco sabía exactamente cómo había que expresar '$i += 2' y, claro, nada de lo que probaba me servía...

Ahora me queda el problema de tratar varios valores para una clave (hay líneas del tipo de 'casa maison casa house ducha doccia casa casa'), voy a intentar resolverlo. Gracias de nuevo, ¡y enhorabuena por este foro!
boteropepe
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-03-08 15:14 @676

Re: Crear un hash desde un fichero de palabras

Notapor explorer » 2010-03-09 05:48 @283

Para guardar varios valores en una clave, se suele usar otra estructura de datos: un hash de arrays:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my %hash;
  7.  
  8. open my $FICHERO, q[<], 'fichero_palabras.txt';  # abrimos el fichero
  9.  
  10. while (my $linea = <$FICHERO>) {                 # para todas las líneas del fichero
  11.     chomp $linea;                                # quitamos el carácter de fin de línea
  12.  
  13.     my @palabras = split " ", $linea;            # separamos las palabras por sus espacios
  14.  
  15.     for (my $i = 0; $i < @palabras; $i += 2) {   # para todos los pares de palabras
  16.  
  17.                                                  # no hacemos nada si ya estaba guardada
  18.         next if grep { $_ eq $palabras[$i+1] } @{ $hash{$palabras[$i]} };
  19.  
  20.         push @{$hash{$palabras[$i]}}, $palabras[$i+1];  # guardamos la relación $palabra1 => $palabra2
  21.     }
  22. }
  23.  
  24. close $FICHERO;                                  # cerramos fichero
  25.  
  26. use Data::Dumper;
  27. print Dumper \%hash;                             # vemos el contenido
  28.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$VAR1 = {
          'casa' => [
                      'maison',
                      'house',
                      'casa'
                    ],
          'amarillo' => [
                          'amarelo'
                        ],
          'caballo' => [
                         'horse'
                       ],
          'ducha' => [
                       'doccia'
                     ]
        };
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Queda un poco más corto usando Perl v5.10:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;  # Siempre hay que tener sentido común
  3. use autodie;        # Mejor morir, que regresar humillado --Proverbio Klingon
  4.  
  5. my %diccionario;
  6.  
  7. open my $FICHERO, q[<], 'fichero_palabras.txt';
  8.  
  9. while (<$FICHERO>) {
  10.     chomp;
  11.  
  12.     my @palabras = split;
  13.  
  14.     for(my $i = 0; $i < @palabras; $i += 2) {
  15.  
  16.         my ($clave, $valor) = @palabras[$i,$i+1];
  17.  
  18.         next if $valor ~~ @{ $diccionario{$clave} };
  19.  
  20.         push @{ $diccionario{$clave} }, $valor;
  21.     }
  22. }
  23.  
  24. close $FICHERO;
  25.  
  26. use Data::Dumper::Simple;
  27. say Dumper(\%diccionario);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Este programa hace lo mismo que el anterior, pero con una sintaxis más moderna.

Sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$diccionario = {
          'casa' => [
                      'maison',
                      'house',
                      'casa'
                    ],
          'amarillo' => [
                          'amarelo'
                        ],
          'caballo' => [
                         'horse'
                       ],
          'ducha' => [
                       'doccia'
                     ]
        };
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
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


Volver a Básico

¿Quién está conectado?

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

cron