Bueno, si se trata de leer un fichero FASTA, valdría (creo yo), con saber que la línea comienza con '>' y lo que sigue es el nombre de la secuencia que luego queremos buscar, así que la expresión regular se puede simplificar bastante.
En cuanto al procesamiento, vale con leer la lista de secuencias a buscar e imprimir, que guardaremos en el
hash %es_interesante. La asignación del 1 puede despistar, pero realmente, solo queremos crear un
hash que nos sirva para recordar los nombres de las secuencias que nos interesan.
Luego, a la hora de leer el fichero de secuencias, nos vale con ir guardando las secuencias interesantes que vamos encontrando. En la siguiente solución, en el
hash %secuencias.
Y, finalmente, las sacamos por SALIDA, de forma ordenada (solo las que hemos encontrado).
El problema que había era que el bucle for() recorría todo el
hash %es_interesante, y siempre sacaba un listado de todos sus valores, sean la secuencia o el '1' que habíamos metido antes.
Es mejor tener las cosas por separado, y así, ahora tenemos un
hash para indicar qué queremos buscar y otro para guardar qué hemos encontrado.
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
# Lectura del fichero de secuencias a extraer ###############################
print "Enter your list name:\n";
my $entrada = <STDIN>;
my %es_interesante; # indica cuáles queremos imprimir
open(SEQ, $entrada) or die ("ERROR: $!\n");
while (my $nombre = <SEQ>) {
chomp $nombre;
$es_interesante{$nombre} = 1; # lo almacenamos en la memoria asociativa
}
close SEQ;
# Lectura del fichero FASTA y escritura del resultado ########################
print "Enter your genome fasta name:\n";
my $genome = <STDIN>;
chomp $genome;
open(FASTA, $genome) or die ("ERROR: $!\n");
my $nombre_secuencia; # Guarda el nombre de la secuencia que estamos leyendo
my %secuencias; # Guarda las que hemos encontrado
while (my $linea = <FASTA>) {
chomp $linea;
if ($linea =~ /^>(.+)/ ) { # Comienzo de una secuencia nueva
$nombre_secuencia = $1; # Nombre de la secuencia
next; # pasamos a la siguiente línea
}
# Si estamos en una secuencia interesante
if ($nombre_secuencia and $es_interesante{$nombre_secuencia}) {
$secuencias{$nombre_secuencia} .= $linea; # la guardamos
}
}
close FASTA;
# Salida del resultado ######################################################
open(SALIDA,'>secuencias.txt') or die ("ERROR: $!\n");
for my $nombre (sort keys %secuencias) {
print SALIDA ">$nombre\n$secuencias{$nombre}\n";
}
close SALIDA;
__END__
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Lo he ejecutado y ya salen las secuencias que queremos (y no todas, con el '1').