Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Necesito ayuda urgente . Tengo que hacer el mismo trabajo que la otra perldesesperada, de hecho, creo que es compañera de clase
Tenemos que conseguir sacar de una cadena de ADN varios genes. Los genes tienen que empezar por ATG y acabar por TGA, TAA o TAG, y tenemos que indicar las posiciones en las que se encuentran el inicio y la terminación.
La subrutina que he hecho se encuentra al final del mensaje. La explicación de lo que hago o lo que quiero conseguir que haga está a continuación.
Yo he hecho una subrutina en la que paso la cadena de la que sacaremos los genes. También paso por referencia un array en el que recogeré las posiciones de inicio y otro array que paso por referencia que recogerá las posiciones de terminación. También paso la longitud mínima que tienen que tener los genes. En total, pasamos la cadena, dos array y la longitud mínima.
Dentro de la subrutina inicializo todas las variables que necesito. Después hago un for() que haga una serie de instrucciones desde la $posicion = 0, mientras la $posicion sea menor que la longitud de la cadena menos 2, y que después de hacer el bucle le sume a $posicion 3.
Las instrucciones del interior del bucle for() son:
Primero hago un substr() para extraer de la cadena las tres primeras letras a partir de $posicion.
Luego hago un if() con la condición de que las tres letras extraídas sean ATG. Dentro del if() hago un bucle do - until. Este bucle do-until me tiene que concatenar a una variable las letras de tres en tres hasta que un triplete de letras coincida con TGA, TAA o TAG. También dentro del bucle hago que me recoja la posición de las últimas tres letras que se concatenan en una variable (para tener así la posición de la terminación).
A continuación, fuera ya del bucle do-until pero dentro del if() hago otro if(). La condición es que si la longitud de la variable donde he ido concatenando las letras es mayor que la longitud mínima, quiero que en la primera línea de un array me recoja el gen, es decir, las letras concatenadas (se supone que en cada línea del array quiero recoger un gen). También dentro de este if() quiero que en el array de las posiciones de inicio me recoja la posición de inicio y en el array de las posiciones de terminación me recoja la posición de terminación. Después, para que todo funcione, borro la información recogida en la variable donde se concatenaban las letras, y sumo uno a otra variable que indicará la linea de los arrays en la que se deben imprimir los datos.
Si el if() es falso, hago un elsif() en el cual borro la variable con las letras concatenadas.
Salgo del primer if. Hago un else{} para que si las tres letras que extraje no coinciden con ATG, sume 3 a la posición del for() y continúe ejecutando hasta que se acabe la cadena.
La subrutina me tiene que devolver el array con los genes, ya que los otros arrays han sido modificados directamente en la subrutina.
Al mandarle imprimirme el array de los genes, me imprime lo que serían las tres líneas del array, con el mismo gen en las tres. He usado el depurador, pero no sé que es lo que está mal. Es como si hiciera tres veces lo mismo, sin avanzar posiciones en la cadena.
Creo que la subrutina que he hecho está bien planteada, pero no sé qué ocurre.
Por favor, ¡¡necesito ayuda!! De este trabajo depende que apruebe la asignatura, y aunque tenga todo bien planteado, si el resultado no es idéntico al que tiene que dar, todo el trabajo no cuenta para nada.
La subrutina es:
Using perl Syntax Highlighting
- my(@genes) = seleccionar_secuencias ($DNA, \@posinicio, \@posfinal, $longitudmin);
- sub seleccionar_secuencias {
- my($secuencia, $posinicio, $posfinal, $longitudmin) = @_;
- my($posicion) = 0;
- my($codoninicio);
- my($codon);
- my($gen);
- my($i) = 0;
- my(@genes);
- for ($posicion, $posicion < length $secuencia - 2, $posicion = $posicion + 3) {
- $codoninicio = substr ($secuencia, $posicion, 3);
- if ($codoninicio =~ /ATG/i) {
- my($pos2) = $posicion;
- my($pos3) = $posicion;
- do{
- $codon = substr ($secuencia, $pos2, 3);
- $gen .= $codon;
- $final = $pos2 + 1;
- $pos2= $pos2 + 3;
- } until ($codon =~ /TA[AG]/i or $codon =~ /TGA/i);
- if ($longitudmin < length $gen) {
- $genes[$i] = $gen;
- $$posinicio[$i] = $pos3 + 1;
- $$posfinal[$i] = $final;
- $i = $i + 1;
- $gen = "";
- }
- elsif ($longitudmin > length $gen) {
- $gen = "";
- }
- else {
- next;
- }
- }
- }
- return @genes;
- }
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4
El resultado que me da es:
Using text Syntax Highlighting
ATGTGTTTATGA ATGTGTTTATGA ATGTGTTTATGA
Me debería dar:
Using text Syntax Highlighting
ATGTGTTTATGA ATGCCAACAGTATTTCCAAAGAGCGTTGAATTAATAG
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
La cadena que le paso es:
Using text Syntax Highlighting
CACATGTGTTTATGAGTGTGAGTTTAATCAACATGAATTTTTGAGACTGACGGTGCACGAGATGTTGTCATAAGTTCCCATGCCAACAGTATTTCCAAAGAGCGTTGAATTATAGC
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
¡¡¡MUCHÍSIMAS GRACIAS!!!