El problema está en leer el fichero línea a línea.
Al leer una línea no tenemos la seguridad de que dentro de ella se encuentre el patrón entero que estamos buscando.
Tenemos dos soluciones:
O leemos el fichero entero a una variable escalar y a continuación hacemos un
$fichero =~ s/^Aquí.+?\./abc/gsm;con lo que estamos buscando todas las líneas que empiezan (
^) por
Aquí seguidas por una serie de caracteres (un carácter (
.) seguido por uno o más (
+)) hasta el primer (
?) punto (
\.), y lo sustituimos por
abc. Esto lo hacemos para una variable escalar con múltiples líneas (
/m), incluidos los finales de línea (
/s) y para todas las ocasiones (
/g).
O, la otra solución, que consiste en leer línea por línea y llevar un control de lo que va ocurriendo. Por ejemplo.
Using text Syntax Highlighting
Para todo el texto, leemos una línea cada vez
Si la bandera está a 1 (estamos dentro de un patrón detectado)
Si la línea tiene el final del patrón
Ponemos la bandera a 0 y
Hacemos la sustitución, la pintamos y seguimos con la siguiente línea
Seguimos con la siguiente línea (aún seguimos dentro del patrón detectado)
Si la línea contiene el comienzo y final del patrón,
Hacemos la sustitución, la pintamos y seguimos con la siguiente línea
Si la línea contiene el comienzo del patrón
Ponemos la bandera a 1 (estamos dentro de un patrón pero no sabemos cuándo terminará) y
Seguimos con la siguiente línea
Si no ocurre nada de lo anterior, pintamos la línea tal cual
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Es natural que la primera solución (una línea) sea mejor...
En tu caso:
Using perl Syntax Highlighting
$patron = '(\s*\.*)';
while (<INFILE>) {
if (s/^Aqui$patron./abc/sm) {
print;
}
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Lo que haces es: Para todas las líneas del fichero (
while), si (
if) la línea puede realizar una sustitución del patrón, la pintamos (
print), siendo el patrón a buscar:
^Aqui\s*\.*., que significa: la línea empieza (
^) por
Aqui, seguido de 0 o más espacios en blanco (
\s*), seguidos de 0 o más puntos (
\.*) y seguidos por un carácter cualquiera (
.), para todas las líneas (
/m) leídas (aunque me parece que sólo hemos leído una).