tag:blogger.com,1999:blog-1320528867223721914.post1341668505883273077..comments2024-03-18T10:00:22.981+01:00Comments on #!/perl/bioinfo: Expresión regular de la familia de las O-fucosiltransferasas brunocontrerashttp://www.blogger.com/profile/06780659979139333360noreply@blogger.comBlogger1125tag:blogger.com,1999:blog-1320528867223721914.post-84939790015084769642016-04-11T09:16:26.593+02:002016-04-11T09:16:26.593+02:00Hola, copio aquí comentarios de Joaquín Ferrero:
...Hola, copio aquí comentarios de Joaquín Ferrero:<br /><br />Recuerdo que las clases de caracteres solo contienen caracteres o rangos de caracteres. No son expresiones. Por lo tanto, el carácter '|' dentro de ellas no "funciona" como el operador 'or', sino que está como él mismo.<br /><br />Por lo tanto, la sentencia<br /><br />$_ =~ s/[\s|\n|\-|\.]//g;<br /><br />es igual a esta otra:<br /><br />$_ =~ s/[\s\n\|\-\.]//g;<br /><br />lo cual puede dar problemas si en el texto apareciese ese carácter. Tampoco es necesario "escapar" ciertos caracteres, como el punto o el guión (este último si se coloca al principio de la clase de caracteres). La expresión se puede entonces reducir a<br /><br />s/[-\s\n.]//g;<br /><br />Observar que también se ha quitado la primera parte '$_ =~' porque esa es la operación que por defecto realizará el operador s///.<br /><br />En cuanto a la primera exp. reg., creo que pasa lo mismo con la clase '[S|T]', que quedaría en '[ST]'.<br /><br />Un detalle importante: hay que tener cuidado con los comodines avariciosos '.*' del principio y del final. Pueden hacer desaparecer de la búsqueda algunas coincidencias, o peor: enlentecer la búsqueda.<br /><br />Como estamos buscando un patrón de forma repetida (con la opción '/g'), en este caso, esos comodines son completamente innecesarios. La línea quedaría así:<br /><br />my $motifRE = 'C[^C]{0,21}.C[^C]{2,6}[ST].C[^C]{4,75}C[^C]C[^C]{4,15}C';<br /><br />Otro detalle muy, muy importante: siempre que se puede, NO hay que usar las variables $`, $& y $', ya que enlentece esa expresión regular y todas las demás del programa. Si se está usando un Perl igual o superior a v5.10.0 es mejor usar las equivalentes "${^PREMATCH}", "${^MATCH}" y "${^POSTMATCH}", y poniendo además la opción '/p' en la exp. reg. (más información en perldoc perlre).<br /><br />En vuestro caso, es fácil solventarlo. Si se trata de saber la posición inicial de la secuencia encontrada, sería así:<br /><br />$l = length($1);<br />$end = pos($FASTA[$seq][SEQ]);<br />$start = $end - $l;<br /><br />(bueno, habría que sumar o restar 1 -o no hacer nada- según queramos que las posiciones estén basadas en 0 o 1).<br /><br />De forma más moderna:<br /><br />$start = $-[1];<br />$end = $+[1];<br />$l = $end - $start + 1;<br /><br />Más información en perldoc perlvar (buscar por @+ y @-).<br /><br />Un último consejo: los Perl más modernos (a partir de v5.20) han aumentado mucho la velocidad de procesamiento de exp. reg.<br /><br />Saludos,<br />JFbrunocontrerashttps://www.blogger.com/profile/06780659979139333360noreply@blogger.com