Victor escribiste:tengo un fichero denominado $seq el cual contiene una serie de secuencias en cada linea ... adicionalmente tengo una base de datos llamada $dat_bas .... la idea es que debo tomar cada linea de mi fichero $seq y lo enfrento con la base de datos ... cada vez que haya una coincidencia con la base de datos y la secuencia debo tomar los 100 elementos que se encuentran antes del inicio de la secuencia y los 100 elementos al final de la secuencia.
- Código: Seleccionar todo
my $seq = 'fgvodffoslssk'; # esta es una secuencia a buscar
my $largo_seq = length $seq;
# este es un ejemplo de un segmento de la DB..
my $dat_bas = 'aslkddjcncxxnflldkskdjfhfhiru[b]fgvodffoslssk[/b]asdfghjklmnbv';
Como la secuencia genética es conocida (no hay bases que desconozcamos), es mejor usar la función
index, que, como dice el manual, no es tan pesada como una expresión regular y sí algo más rápida. Naturalmente la solución de kidd es muy elegante, pero aquí vamos a darle a Victor más posibilidades.
Suponiendo que tenemos en $seq la secuencia a buscar y en $data la secuencia a analizar, se podría hacer así:
Using perl Syntax Highlighting
my $seq=q(agtgctagtagctagctacgggagctag
);
my $data=q(dsfhkdsfhksjd
->agtgctagtagctagctacgggagctag<-fhkjdshfksjdfh
);
# Hacemos la búsqueda
my $pos = index($data,$seq);
# Si no la encontramos, saltamos a probar con otra secuencia
return if $pos == -1;
# Encontrado. Ahora hay que saber la parte que queremos recortar.
# Queremos quedarnos a los lados con $largo bases más
my $largo = 100;
# $lado_izq será el comienzo del recorte por el lado izquierdo
# Si resulta que la secuencia la hemos encontrado 'demasiado' cerca
# del borde izquierdo, ponemos el $lado_izq al índice de la primera base,
# es decir, 0. Si no es así, lo ponemos $largo posiciones antes de la
# secuencia encontrada.
my $lado_izq = ($pos < $largo) ? 0
:$pos-$largo;
# $recorte es la secuencia extraída: la secuencia que estábamos buscando
# rodeada de bases extras (hasta $largo más)
my $recorte = substr(
$data,
$lado_izq,
( $pos - $lado_izq ) + $largo_seq + $largo
);
# Impresión a pantalla, fichero, etc...
print $recorte,"\n";Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
¿Por qué hay que hacer cuentas? Pues porque se puede dar el caso de que la secuencia a buscar esté hacia el principio de la base de datos, por lo que no podremos conseguir extraer las 100 bases extra antes de ella. Hacemos unas sumas y restas para saber esa posición.
En cuanto a la parte derecha, no hay problema. La función
substr se encargará de darnos todo lo que pueda desde la base de datos, aunque la secuencia encontrada esté cerca del final.
Este enlace te será de interés.
De todas formas... es mejor usar
BioPerl.
En su
web oficial podrás encontrar mucha información.
En el
FAQ hay una pregunta parecida a lo que buscas.
Por este foro ya hemos
hablado un poco del tema.
Aquí, en el Instituto Pasteur hay un curso.
A propósito... estoy buscando puesto de trabajo de bioinformático