Lo que pasa es que estás creando un
hash de dos dimensiones, es decir, un
hash que contiene una referencia a otros
hash. Para cada valor leído del segundo fichero, deberías no solo buscarlo en la primera dimensión, sino también en la segunda (para lo cuál, deberías volver a recorrer la primera dimensión: buscar todas las claves correspondientes a cada clave de la primera).
La solución que te comenté es la de combinar las dos nombres para que juntos formen una sola clave. Y ordenados, para evitar las duplicidades por estar intercambiados los nombres, en cada fila.
Esta es una versión que implanta esa solución:
Using perl Syntax Highlighting
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
use diagnostics;
use Data::Dumper;
### Comprobamos los argumentos pasados al programa
@ARGV == 2 or die "Uso: $0 <fichero 1> <fichero 2>\n";
my ($fichero1, $fichero2) = @ARGV;
### Leer la información del primer fichero
my %scores;
open my $FILE1, q[<], $fichero1 or die "ERROR: No puedo leer el fichero $fichero1: $!\n";
while (<$FILE1>) {
chomp;
my @columnas = split;
next if @columnas != 3;
$scores{ join q[;], sort @columnas[0,1] } = $columnas[2];
}
close $FILE1;
say Dumper \%scores;
### Leer la lista del segundo fichero
open my $FILE2, q[<], $fichero2 or die "ERROR: No puedo leer el fichero $fichero2: $!\n";
chomp(my @claves = <$FILE2>);
close $FILE2;
my $claves = join q[|], @claves;
$claves = qr($claves);
say Dumper $claves;
### Presentar la lista de claves solicitadas
for my $score (keys %scores) {
if ($score =~ $claves) {
say join "\t", split(/;/, $score), $scores{$score};
}
}
Coloreado en 0.004 segundos, usando
GeSHi 1.0.8.4
La salida es
Using text Syntax Highlighting
$VAR1 = {
'HP0329;HP0952' => '0.651',
'HP0002;HP1574' => '0.641',
'HP0172;HP0799' => '0.698',
'HP1132;HP1420' => '0.675',
'HP0355;HP1195' => '0.581',
'HP0001;HP0002' => '0.695',
'A;B' => 'Score'
};
$VAR1 = qr/(?-xism:HP0799|HP0952|HP1132|HP0172)/;
HP0329 HP0952 0.651
HP0172 HP0799 0.698
HP1132 HP1420 0.675
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
El funcionamiento es:
* de la línea 10 a 13, leemos los argumentos
* del 17 al 29 leemos el primer fichero. Metemos cada línea de puntuación en una clave/valor de un
hash. La clave se forma uniendo las dos columnas ordenadas con sort(), con el carácter ';'
* del 33 al 40 leemos el segundo fichero. Cada nombre irá a parar a un
array, que luego se transformará en una expresión regular (que es la que sale en pantalla), compuesta por todos los nombres unidos con '|', significando "alternativas" dentro de una exp. reg.
* del 44 al 48 hacemos la salida. Consiste en hacer un bucle por todas las claves leídas desde el fichero primero, ver si coinciden con la expresión regular construida a partir del segundo fichero, y en ese caso, hacemos una salida formateada con tabuladores. Observar que usamos split() para deshacer la unión de los nombres unidos por ';', para unirlos ahora con "\t", junto con el valor de la puntuación.
El truco está en la línea 25: combinamos los dos nombres en una sola clave. Y en la línea 45, la búsqueda que hace la exp. reg. que hemos construido unas líneas antes.
Ejemplo, en una de las vueltas del último bucle se realiza la siguiente comparación:
if ( 'HP0329;HP0952' =~ /HP0799|HP0952|HP1132|HP0172/ ) {En este caso, la comparación resulta verdadera, porque la cadena "HP0952" sí que está en la cadena de prueba (la de la izquierda).