• Publicidad

Significado de expresiones regulares

Perl aplicado a la bioinformática

Significado de expresiones regulares

Notapor burbuja » 2012-01-19 03:43 @196

Hola, una duda.

¿Qué significan exactamente estas líneas?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ( $line =~ /^SQ/ .. /^\/\// ) {
  2.     next if $line =~ m {^(?:SQ|//)};
  3.     $dna .= $line;
  4. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Yo creo que es: si coge de $line lo que está entre SQ y // y hace que pase a la siguiente línea si encuentra un matching en una línea que al principio tenga 0 o 1 SQ o //, y va concatenando las líneas a $line, pero no sé si será correcto...

¡Gracias!
burbuja
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-12-18 13:30 @604

Publicidad

Re: Significado de expresiones regulares

Notapor explorer » 2012-01-19 10:17 @470

El operador '..' es un biestable. Quiere decir que toma dos estados: verdadero o falso. Cada vez que lo ejecutamos, mira a ver si se cumple la expresión de la izquierda. Si se cumple, su valor se pone a verdadero, y en las sucesivas vueltas, comprobará la expresión de la derecha. Si en algún momento se cumple, vuelve a ponerse a falso, con lo que comenzará a mirar por la expresión de la izquierda.

En este caso, estamos analizando $line, que suponemos que se trata de líneas de un fichero.

Supongamos que el programa empieza. Entonces el operador '..' mira por la expresión de su izquierda: $line =~ /^SQ/, que quiere decir que si la $line comienza por SQ, devolverá verdadero.

Cuando eso ocurra, el biestable se pone a verdadero, y ejecuta las sentencias dentro del if() para esa y todas las líneas que siguen. La primera sentencia hace saltar a la siguiente vuelta en caso de que $line sea o lo primero o lo último que queremos capturar. Si es una línea intermedia, la suma a $dna.

La segunda expresión está mal... o eso parece... Tal y como está ahora, está probando la expresión regular contra la variable $_ (la de por defecto), no contra $line, que debería ser lo correcto. Debería ser $line =~ /^\/\//, o más claro, $line =~ m{^//}.

Cuando la $line contenga //, entonces el biestable se pone a falso, y las líneas ya no entrarán en el if(), hasta que se vuelva a cumplir la primera expresión.

El efecto final es que en $dna conseguimos todas las líneas que están entre SQ y //.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados