Para guardar varios valores en una clave, se suele usar otra estructura de datos: un hash de arrays:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
my %hash;
open my $FICHERO, q[<], 'fichero_palabras.txt'; # abrimos el fichero
while (my $linea = <$FICHERO>) { # para todas las líneas del fichero
chomp $linea; # quitamos el carácter de fin de línea
my @palabras = split " ", $linea; # separamos las palabras por sus espacios
for (my $i = 0; $i < @palabras; $i += 2) { # para todos los pares de palabras
# no hacemos nada si ya estaba guardada
next if grep { $_ eq $palabras[$i+1] } @{ $hash{$palabras[$i]} };
push @{$hash{$palabras[$i]}}, $palabras[$i+1]; # guardamos la relación $palabra1 => $palabra2
}
}
close $FICHERO; # cerramos fichero
use Data::Dumper;
print Dumper \%hash; # vemos el contenido
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Sale:
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:
Using perl Syntax Highlighting
#!/usr/bin/perl
use common::sense; # Siempre hay que tener sentido común
use autodie; # Mejor morir, que regresar humillado --Proverbio Klingon
my %diccionario;
open my $FICHERO, q[<], 'fichero_palabras.txt';
while (<$FICHERO>) {
chomp;
my @palabras = split;
for(my $i = 0; $i < @palabras; $i += 2) {
my ($clave, $valor) = @palabras[$i,$i+1];
next if $valor ~~ @{ $diccionario{$clave} };
push @{ $diccionario{$clave} }, $valor;
}
}
close $FICHERO;
use Data::Dumper::Simple;
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:
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