El primer problema (buscar la enfermedad y el gen asociado a un síntoma) os falta algo esencial: buscarlo.
En las líneas 6 y 9, lo único que hacéis es imprimir el valor de enfermedad y gen... para todas las claves del hash %E (así está indicado en la línea 4). Pero... no hacéis la prueba de si esa enfermedad corresponde con el $sintomas[$s] encontrado en la línea 3. En definitiva... pinta todas las enfermedades y genes.
La clave para resolver es: a partir de la línea 3, ¿cómo relacionamos el síntoma encontrado con su correspondiente enfermedad/gen?
Un detalle interesante... no sabemos qué contiene @valor1. Si hacemos caso a lo que dice la línea 3, contiene números enteros, ya que se están usando como índices del array @valor1.
Aquí hay una posible solución:
Using perl Syntax Highlighting
#!/usr/bin/env perl
use v5.26; # queremos características modernas
use utf8; # el código contiene caracteres en utf8
use open IO => qw':utf8 :std'; # las entradas y salidas en UTF8. También las E/S estándar
use autodie; # Es mejor morir que regresar con deshonor. --Proverbio Klingon
# Síntomas de prueba
my @sintomas = ('Babeo excesivo', 'Congestion nasal', 'estrabismo');
# Todos los síntomas
my @valor1;
# Leemos el archivo de enfermedades
my %E1;
open my $ENFERMEDADES, '<', 'ENFERMEDADES.txt';
while (<$ENFERMEDADES>) {
#chomp; # quitamos retorno de carro
s/[\r\n]+$//; # quitamos retorno de carro (versión para todas los sistemas)
my($clave, $valor) = /^(\w+):\s*(.+)/; # separamos en dos campos
$E1{$clave} = $valor;
if ($clave =~ /^Sintomas/) {
my @s = split /[;]/, $valor;
push @valor1, @s;
}
}
close $ENFERMEDADES;
foreach my $s (@sintomas) { # Para todos los síntomas de los pacientes
say "Síntoma: $s";
foreach my $v1 (@valor1) { # Para todos los síntomas de enfermedades
if ( $s eq $v1 ) { # Si el síntoma del paciente está registrada...
foreach my $clave ( keys(%E1) ) { # Buscamos la enfermedad y el gen
if ( $clave =~ /^Sintomas(\d+)/ ) { # Si son síntomas...
if (index($E1{$clave}, $s) != -1) { # y entre ellos está el que buscamos...
my $i = $1; # nos quedamos con el número que sigue a "Sintomas"
say "Posible enfermedad: $E1{'Enfermedad' . $i}";
say "Esta enfermedad se expresa en el gen: $E1{'Gen' . $i}";
}
}
}
}
}
}
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
La salida de este programa es:
Using text Syntax Highlighting
Síntoma: Babeo excesivo
Posible enfermedad: Sindrome de Moebius
Esta enfermedad se expresa en el gen: PLXND1
Síntoma: Congestion nasal
Posible enfermedad: Fibrosis quistica
Esta enfermedad se expresa en el gen: CFTR
Síntoma: estrabismo
Posible enfermedad: Sindrome de Moebius
Esta enfermedad se expresa en el gen: PLXND1
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
El truco está en usar el número que sigue a las palabras "Enfermedad", "Sintomas", "Gen". Pintar el tratamiento se haría de la misma manera.
Es un error definir la subrutina de esa manera... estáis redefiniéndola en cada paso del bucle foreach(). Lo mejor es pasar argumentos y leerlos en la subrutina y hacer operaciones con ellos.