El problema no es sencillo, porque alguna 'la' es capturada por una captura anterior...
Esto es lo que me sale a mi cuando ejecuto tu solución:
Using perl Syntax Highlighting
#!/usr/bin/perl
my $cadena = do { local $/; open F, "kk.txt"; <F> };
my @solucion = ($cadena =~ m/(.*\n.*\n).*la.*\n(.*\n.*)/g);
for (@solucion) {
print "[$_]";
}
Coloreado en 0.004 segundos, usando
GeSHi 1.0.8.4
Using text Syntax Highlighting
[es una prueba para el segundo
ejercicio de entrega
][en el que tenemos que encontrar
alguna vez la subcadena][
en todo el texto
][o tendremos que buscar y buscar
sin éxito]
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Entonces vemos que hay cuatro elementos.
El primero contiene las dos líneas anteriores al primer 'la'.
El segundo contiene las dos líneas siguientes al primer 'la'.
El tercero contiene la línea anterior y el final de la línea anterior a la anterior, del tercer 'la'.
El cuarto contiene las dos líneas siguientes al cuarto 'la'.
Entonces... en la expresión regular hay que tener en cuenta el caso de comenzar a buscar por el siguiente 'la' justo después de la posición del recién encontrado. Eso lo consigues llamando a pos() y usando las variables especiales @- o @+ se pueden saber las posiciones de las cosas que vamos encontrando (Más información en tu propio ordenador en
perldoc perlvar,
y en la Web (
traducido al español)).
Humm... Yo creo que se resuelve mucho más fácil usando Tie::File y aplicando la expresión regular línea por línea del archivo.