O sea... recapitulando...
Tenemos un fichero con un montón de bloques, cada bloque son 4 líneas, de las que solo nos interesan la segunda y la cuarta.
Le pedimos al usuario que nos dé una o más cadenas de búsqueda de 5 bases cada una.
Por cada cadena, generamos seis combinaciones, que son la misma cadena y cinco más, de resultas de una indeterminación en cada base.
Cada combinación la buscamos en los comienzos de las secuencias (segundas líneas). Si están, recortamos las comienzos de las líneas 2 y las líneas 4, y grabamos el bloque resultado en un fichero aparte (del que no sabemos cómo nombrarlo y tampoco qué hacer con los bloques que no concuerdan con ninguna cadena de búsqueda).
¿Es eso?
Este programa da un resultado así, excepto la parte de creación de los ficheros.
Using perl Syntax Highlighting
#!/usr/bin/perl
use common::sense;
use autodie;
## Pedimos las cadenas a buscar
print "Introduzca la cadena o cadenas a buscar, separadas por comas: ";
my $cadenas = <>; # leemos las cadenas
#my $cadenas = 'CAGTT,ACGTA';
$cadenas =~ s/\s+//g; # quitamos todos los caracteres en blanco y el final de línea
$cadenas = uc $cadenas; # todo a mayúsculas, por si acaso
my @cadenas = split /,/, $cadenas;
## Generamos las combinaciones por cada cadena
for my $cadena (@cadenas) {
my $nueva_cadena = $cadena; # combinación sin incertidumbre
for my $i (0 .. 4) { # resto de combinaciones de incertidumbres
substr(my $c = $cadena, $i, 1) = '.';
$nueva_cadena .= "|$c";
}
$cadena = $nueva_cadena; # guardamos en el array
}
$cadenas = join q[|], @cadenas;
my $regex = qr/^($cadenas)/; # aquí construiremos la expresión regular
#say $regex;
## Lectura del fichero de bloques
my ($titulo, $seq, $subtitulo, $texto);
open my $fh, q[<], 'kk.txt';
while (my $linea = <$fh>) {
die if $linea !~ /^@/; # Oops, algo fue mal
$titulo = $linea; # leemos el bloque
$seq = <$fh>;
$subtitulo = <$fh>;
$texto = <$fh>;
# quitar finales de líneas
chomp($titulo, $seq, $subtitulo, $texto);
# say "[$titulo, $seq, $subtitulo, $texto]";
if ($seq =~ $regex) { # buscamos en $seq las cadenas
# say "Encontrado $1 en $seq";
say substr $seq, 5; # Recorte
say substr $texto, 5;
}
}
close $fh;
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
La salida es
Using text Syntax Highlighting
TCGGGTTTTATGCC
+++++abtttbcbm
TCGGGTCCTATTCC
++b++abtntbccm
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
La expresión regular que formamos a partir de las cadenas de búsqueda tiene un aspecto como este:
(?-xism:^(CAGTT|.AGTT|C.GTT|CA.TT|CAG.T|CAGT.|ACGTA|.CGTA|A.GTA|AC.TA|ACG.A|ACGT.))que, como ves, es una alternancia de todas las combinaciones que queremos probar.
De esta manera, nos ahorramos bucles y pruebas, dando un resultado muy rápido.