Perl está haciendo lo que le estás pidiendo... aunque a veces le pides cosas raras...
Primero... no se suele usar
foreach junto con la opción '/g'. Es mejor usar
while:
Using perl Syntax Highlighting
use File
::Slurp;
@file = read_file
("lo que sea");
foreach ( @file ) {
while ( /patron/ig ) {
$i++;
}
}
print $i;Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Segundo. El
grep evalúa la expresión de condición por cada elemento de entrada. Eso quiere decir que la open '/g' no te servirá:
grep la olvidará en la siguiente línea. Además... no hay un bucle implícito por CADA línea, sino que estás evaluando una línea cada vez... falta poner un bucle más... pero entonces es mejor usar la expresión regular por sí sola que no usando
grep.
Si te lees el comando
grep del sistema, verás que su misión es saber qué líneas coinciden con el patrón a buscar. Y es algo muy parecido a lo que hace el
grep del Perl. La diferencia es que nosotros podemos darle otra cosa a
grep para que la evalúe como cierta (podría ser un cálculo, por ejemplo, que la longitud de la línea supere una cierta cantidad de letras), aunque lo normal es que usemos una expresión regular para ver si en esa línea está ese patrón.
Así que el resumen es:
grep para saber si un escalar (una línea de un fichero) contiene un patrón, y quedarnos con él (a la postre, quedarnos solo con las líneas que tienen ese patrón... entonces...
grep hace de 'filtro' en Perl). Y una expresión regular sirve para evaluar patrones contra elementos escalares... así que se pueden aplicar a muchas otras circunstancias.
El problema de contar las ocurrencias lo tienes resuelto entonces con tu primera solución, ya que el
grep solo te indica las líneas donde está el patrón.
Otra forma de hacerlo:
Using perl Syntax Highlighting
use File
::Slurp;
$fichero = read_file
("lo que sea");
$i++ while $fichero =~ /patron/ig;
print $i;Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Aquí lo que hacemos es leer todo el fichero en una única variable escalar. Luego hacemos un bucle por todos los patrones encontrados.