asegurac escribiste:Solo tengo unas dudas respecto al código. En la línea 8 introduces lo siguiente "{ aggregate => 0 }" ¿cuál fue el objetivo de esto?
Por defecto,
File::Read devuelve los ficheros leídos como un único elemento (un escalar), pero en esa línea, quiero que cada línea del fichero vaya a un elemento del array. Con la opción 'aggregate', el módulo nos devuelve las líneas en forma de lista de valores.
asegurac escribiste:Estuve investigando qué hace la función "pos()" y no me ha quedado muy claro. ¿De manera sencilla podrías decirme cuál es su utilidad?
(extraído de
perlfunc)
Using text Syntax Highlighting
pos ESCALAR
pos
Devuelve la posición de la última búsqueda m//g para la variable en cuestión
($_ se usa cuando la variable no se ha especificado). Note que 0 es un
desplazamiento de coincidencia válido. undef indica que la posición de búsqueda se
ha reinicializado (normalmente debido a un fallo en el cotejamiento, pero puede
ser también porque todavía no se ha aplicado ningún cotejamiento al escalar). pos
accede directamente a la posición usada por el motor regexp para almacenar el
desplazamiento, por lo que asignar un valor a pos cambiará este desplazamiento, y
también influirá en la aserción de anchura cero \G en las expresiones regulares.
Debido a que un cotejamiento fallido no reinicia el desplazamiento, pos devolverá lo mismo que la última vez que se le llamó. Vea perlre y perlop.
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
En resumen: pos() nos devuelve la posición de la última coincidencia encontrada con la expresión regular. Y podemos cambiar esa posición si le asignamos un valor. El valor está basado en 0 (las posiciones de los caracteres dentro de una cadena empiezan en 0).
Lo que hacemos dentro del bucle del programa es modificar la posición de búsqueda de la expresión regular, para que comience a buscar la coincidencia sólo una base más a la derecha, y no a partir del final de la secuencia encontrada antes. Para eso, le indicamos a pos() que "retroceda" tantas posiciones como de larga sea la secuencia encontrada, menos uno. Así, podemos localizar todas las posiciones solapadas, ya que solo se diferencian en la posición de la primera base.
asegurac escribiste:La parte donde no entiendo nada es donde defines la variable "$rango".
my $rango = Number::Range->new(@posiciones)->range();En esta línea estamos creando un objeto del tipo Number::Range. Le pasamos las @posiciones encontradas de las apariciones. Y de ese objeto creado, llamamos al método range(), que nos devuelve una cadena de caracteres con la representación del rango, agrupado, como este:
26,29,34..40,43. Eso es lo que pintamos en la línea 30.
Lo que sigue después es un bucle while() localizando, con una expresión regular, los números que rodean a cada '..', de la cadena anterior (34 y 40, en el ejemplo). Se hace una cuenta sencilla (40-34+1) y de ahí deducimos cuántos números en tándem hay (7).