• Publicidad

Diferencias grep y =~

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Diferencias grep y =~

Notapor bartg01 » 2007-12-14 06:37 @317

Hola de nuevo a toda la gente enrollada de este foro, me surge una nueva duda en mi avance hacia el conocimiento exhaustivo de Perl ("creo que nunca llegará........snifff.......").

El caso es que no encuentro ningún sitio, donde se exponga una diferencia realista entre el comando grep y =~ de Perl.

Mi problema concreto es cuantificar las coincidencias en un fichero de texto, ya que:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use  File::Slurp;

 @file = read_file ("lo que sea");
for (@file) {
 foreach ($_ =~ /patron/ig) {
        $i++;
  }
}
 print $i;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


imprime en pantalla todas y cada una de las ocurrencias para nuestro patrón, en el archivo. Mientras que:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
   open FILE, ("file");
   $i = grep (/patron/ig, <FILE>);
   print $i;
   close FILE;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


sólo aparece una ocurrencia por cada línea de fichero.

¿Alguien sabe por qué ocurre esto?
bartg01
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2007-11-29 16:15 @718

Publicidad

Notapor Norther » 2007-12-14 08:54 @412

No entiendo muy bien lo que quieres hacer, en el primer código vas aumentando la $i por cada ocurrencia encontrada, sin embargo en el segundo nunca aumentas la $i O_o
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2007-12-14 08:59 @416

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:
Sintáxis: [ Descargar ] [ Ocultar ]
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:
Sintáxis: [ Descargar ] [ Ocultar ]
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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor bartg01 » 2007-12-15 07:10 @340

OK, me quedó requeteclaro. Muchas gracias explorer, la verdad es que estás en todo.

La verdad es que suelo usar =~ pero al descubrir grep, me parecía una buena idea conocer un poco su función a fondo.

Gracias otra vez y un saludo, para todos los organizadores de este foro, es cojonudo :wink: .
bartg01
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2007-11-29 16:15 @718


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados