<div dir="ltr"><div><div><div><div>¡Hola a todos!<br><br>Bueno, ante todo, como decía en mi presentación, soy bastante (muy) novata en Perl, así que es bastante probable que la esté liando con algo muy básico... pero me gustaría compartir mi problema con vosotros, por si alguno supiera darme alguna orientación (aunque sea simplemente remitirme a alguna página concreta de documentación).<br><br></div>El contexto de mi problema es el siguiente: parto de un array que contiene secuencias de nucleótidos (o sea, strings que deben estar formados por "A", "C", "G" o "T"). La cosa es que estos strings pueden contener, cualquiera de ellos, en determinada posición, el carácter "N", que no es "válido". Lo que hace el resto de mi programa es hacer comparaciones dos a dos entre cada elemento del array. Lo que quiero hacer, y el quid de mi duda: si en "x" posición de cualquier elemento encuentro una "N", debo borrar esa "x-ésima" posición en TODOS los elementos del array. Un ejemplo: si tengo @arr = ("AATN", "AATG", "TATG") debo quedarme con @arr2 = ("AAT", "AAT", "TAT").<br><br></div>Sin enrollarme con más explicaciones, os enseño el código con mi planteamiento:<br><br></div><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote"><font><span style="font-family:monospace,monospace">@sequences = ("AATGTCAACGAN", "AATGTCAACGNA", "ATTGTCAACGTN", "ATTGTGATCGTT");</span></font><br><font><span style="font-family:monospace,monospace">for ($i = 0; $i <= scalar(@sequences); $i++) {</span></font><br><font><span style="font-family:monospace,monospace">    if ($sequences[$i] =~ "N") {</span></font><br><font><span style="font-family:monospace,monospace"></span></font></blockquote></div><blockquote><font><span style="font-family:monospace,monospace">      # Localizo las "N" y guardo su posición en un array</span></font><br><font><span style="font-family:monospace,monospace"></span></font></blockquote><div><blockquote><div><font><span style="font-family:monospace,monospace">        push(@pos,index($sequences[$i], "N"));<br>    }<br>}<br><br></span></font></div><div><font><span style="font-family:monospace,monospace"># Elimino posiciones repetidas y ordeno los valores<br></span></font></div><div><font><span style="font-family:monospace,monospace">my @pos = do { my %seen; grep { !$seen{$_}++ } @pos };<br>@pos = sort @pos;<br><br></span></font></div><div><font><span style="font-family:monospace,monospace"># Mi idea era, mediante expresiones regulares, poner "N" en todos los elementos de los arrays, en las posiciones guardadas, para luego eliminarlo todo evitando "corrimientos" en las posiciones<br></span></font></div></blockquote><div><blockquote><font><span style="font-family:monospace,monospace">for ($i = 0; $i <= scalar(@sequences); $i++) {</span></font><br><font><span style="font-family:monospace,monospace">    for ($j = 0; $j <= scalar(@pos); $j++) {</span></font><br><font><span style="font-family:monospace,monospace">        substr($sequences[$i],$pos[$j],1) =~ s/\D/N/;</span></font><br><font><span style="font-family:monospace,monospace">    }</span></font><br><font><span style="font-family:monospace,monospace">}</span></font><br><br></blockquote>Ahora bien, en el último bucle se me va todo de madre, permanece iterando continuamente.<br><br></div><div>La verdad es que seguro que estoy haciendo fatal algo tontísimo, pero no soy capaz de ver el origen del error, por lo que agradecería enormemente cualquier tipo de orientación.<br><br><br></div><div>Un saludo,<br></div><div>Verónica<br></div><div><div><div><div><div><br>-- <br><div class="gmail_signature"><div dir="ltr">Verónica Olmos González<br>Skype: v.olmosg<br>Teléfono/Phone: +34 666 68 16 01<br></div></div>
</div></div></div></div></div></div></div>