por 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