Página 1 de 1

No evalúa en la condición

NotaPublicado: 2017-05-18 11:36 @525
por eduardoemen
Hola, un cordial saludo a todos.

Agradecería mucho si por favor alguien puede darme una ayuda:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $seq = "AGCCATGTAGCTAACTCAGGTTACATGGGGATGACCCCGCGACTTGGATTAGAGTCTCTTTTGGAATAAGCCTGAATGATCCGAGTAGCATCTCAG";
  2.  
  3. for $r ( 0, 1, 2 ) {
  4.     for ( my $i = $r; $i <= length($seq) - 3; $i += 3 ) {
  5.  
  6.         if ( substr( $seq, $i, 3 ) eq "ATG" ) {
  7.             my $j = $i + 3;
  8.  
  9.             while ($j <= length($seq) - 3
  10.                 && substr( $seq, $j, 3 ) ne "TAA"
  11.                 && substr( $seq, $j, 3 ) ne "TAG"
  12.                 && substr( $seq, $j, 3 ) ne "TGA" ) {
  13.                 $j += 3;
  14.             }
  15.  
  16.             if ( $j <= length($seq) - 3 ) {
  17.  
  18.                 my $len = $j + 2 - $i + 1;
  19.                 if ( $len >= 30 ) {
  20.                     print substr( $seq, $i, $j + 2 - $i + 1 ) . "\n";
  21.                 }
  22.             }
  23.         }
  24.     }
  25. }
  26.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

Este primer ejemplo funciona bien, pero al hacerlo con el reverso de la cadena:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $seq = "AGCCATGTAGCTAACTCAGGTTACATGGGGATGACCCCGCGACTTGGATTAGAGTCTCTTTTGGAATAAGCCTGAATGATCCGAGTAGCATCTCAG";
  2. $rev = reverse $seq;
  3.  
  4. for $r ( 0, 1, 2 ) {
  5.     for ( my $i = $r; $i <= length($rev) - 3; $i += 3 ) {
  6.  
  7.         if ( substr( $rev, $i, 3 ) eq "ATG" ) {
  8.  
  9.             my $j = $i + 3;
  10.  
  11.             while (
  12.                 $j <= length($rev) - 3
  13.  
  14.                 && substr( $rev, $j, 3 ) ne "TAA"
  15.                 && substr( $rev, $j, 3 ) ne "TAG"
  16.                 && substr( $rev, $j, 3 ) ne "TGA"
  17.                 ) {
  18.                 $j += 3;
  19.             }
  20.  
  21.             if ( $j <= length($rev) - 3 ) {
  22.  
  23.                 my $len = $j + 2 - $i + 1;
  24.  
  25.                 if ( $len >= 30 ) {
  26.                     print substr( $rev, $i, $j + 2 - $i + 1 ) . "\n";
  27.                 }
  28.             }
  29.         }
  30.     }
  31. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

No comprendo qué pasa con $j+=3 ya que luego if ($j <= length ($rev)-3) no evalúa nada, no hay salida.

Si cambio a if ($j > length ($rev)-3) en cambio sí evalúa y continúa las instrucciones, pero si $j lleva el valor de 12 o 90 que es menor de length ($rev)-3 no entiendo por qué no hay salida. Digo lo de $j+=3 porque hice una prueba con un solo bucle for() (el interior), sin while() y sin asignar $j+=3; y sí continúa evaluando if ($j <= length ($rev)-3) cambiando J por i.

Espero me haya explicado con claridad. De antemano, gracias por si alguien me ayuda, un saludo a todos.

Re: No evalúa en la condición

NotaPublicado: 2017-05-18 14:23 @641
por explorer
No sale nada, porque la secuencia inversa solo contiene dos codones de arranque (ATG), y ninguno de parada.

Creo que eso es lo que pasa.

Re: No evalúa en la condición

NotaPublicado: 2017-05-18 16:59 @749
por eduardoemen
Pues como siempre tienes toda la razón, gracias por tu tiempo y disculpa la tontería pero es que esa misma secuencia según un ejemplo de Rosalind (http://rosalind.info/problems/orf/) da 4 proteínas, yo obtengo las 2 últimas con la secuencia normal y supuse que las 2 primeras provienen de la cadena reversa, seguro hay algo que se me escapa porque no creo que ellos estén equivocados. Un saludo.

Re: No evalúa en la condición

NotaPublicado: 2017-05-19 09:12 @425
por eduardoemen
Que lo he comprobado con el ORFfinder del NCBI y la secuencia del dataset de Rosalind sólo tiene 2 marcos de lectura de 30 o más nucleótidos por lo que sólo produce 2 proteínas, sólo por comentarlo. Un saludo.

Re: No evalúa en la condición

NotaPublicado: 2017-05-22 19:23 @849
por explorer
Esta es otra versión, usando expresiones regulares.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3.  
  4. my $seq = "AGCCATGTAGCTAACTCAGGTTACATGGGGATGACCCCGCGACTTGGATTAGAGTCTCTTTTGGAATAAGCCTGAATGATCCGAGTAGCATCTCAG";
  5.  
  6. say "Analizando al derecho\n$seq";
  7. analizar($seq);
  8.  
  9. $seq = reverse $seq;
  10. say "Analizando al revés\n$seq";
  11. analizar($seq);
  12.  
  13. sub analizar {
  14.     my $seq = shift;
  15.  
  16.     while ( $seq =~ m/(ATG(?:.{3})*?(?:TAA|TAG|TGA))/g) {
  17.  
  18.         my $posicion = pos($seq) - length($1);
  19.  
  20.         if ( length $1 >= 30) {
  21.             say "[$posicion;", pos($seq) - 1 - 2, "] ", $1;
  22.         }
  23.         pos($seq) = $posicion + 1;              # reposicionamos la búsqueda un carácter más allá del inicio de lo encontrado
  24.     }
  25. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4