Debes utilizar la técnica de los
hash: lees el primer fichero y lo almacenas en un
hash. Luego vas analizando el segundo, y los propios
hash te van diciendo si está o no, y cuántas veces.
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
use File::Slurp;
my @archivo_uno = read_file('Salida.txt', chomp => 1); # leemos el archivo, quitando los avances de línea
my %archivo_uno = map { $_ => 0 } @archivo_uno; # lo pasamos a un hash
my %nuevos; # guardará códigos que no están en el primer archivo
open my $archivo_dos_fh, "<Kinase.txt";
while (<$archivo_dos_fh>) { # leemos el segundo archivo, línea a línea
my $codigo = (split /,/)[0]; # nos quedamos con la primera parte
if (defined $archivo_uno{$codigo}) { # si coincide con alguno del primer archivo
$archivo_uno{$codigo}++; # le sumamos una aparición más
}
else { # si no, es un código desconocido
$nuevos{$codigo}++; # sumamos una aparición más
}
}
close $archivo_dos_fh;
# Recuento de los encontrados:
# Bucle por todos los códigos de @archivo_uno,
# ordenados según el valor numérico de sus valores (las veces que aparecieron), de forma inversa (de más a menos)
print "Recuento:\n";
for my $codigo (sort { $archivo_uno{$b} <=> $archivo_uno{$a} } @archivo_uno) {
print "$codigo $archivo_uno{$codigo} veces\n";
}
# Códigos no reconocidos:
my @nuevos = keys %nuevos; # les contamos
if (@nuevos) { # si hay alguno...
print "Códigos nuevos:\n";
for my $codigo (sort { $nuevos{$b} <=> $nuevos{$a} } @nuevos) { # sacamos todos, ordenados numéricamente
print "$codigo $nuevos{$codigo} veces\n";
}
}
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Si estás seguro de que no va a haber códigos nuevos, puedes quitar toda la parte referida a %nuevos y @nuevos.
El tema principal es que estamos usando los
hash para guardar el número de veces que aparece cada código, y no un doble bucle para hacer comparaciones, mucho más lento.