• Publicidad

Por qué este array solo contiene un elemento

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

Por qué este array solo contiene un elemento

Notapor Altair Auditore » 2011-08-15 09:03 @418

Hola..
Soy nuevo en Perl y en esto de las expresiones regulares.. El problema es que hago una búsqueda en un archivo y guardo el resultado en un array pero no entiendo por qué siempre obtengo solo el último elemento del array... Acá el código...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. foreach $line (<LOGFILE>) {
  2.     chomp($line);
  3.     if ( $line =~ m /http:\/\/www.google.de\/search\?q\=(.*[a-z0-9]\b&ie{1}\b)/ig ) {
  4.         @google = $1;
  5.     }
  6.  
  7. }
  8. foreach $linea (@google) {
  9.     print $linea;
  10. }
  11.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


¿Podrían echarme una manito y decirme qué estoy haciendo mal? Porque yo no lo veo...
Muchas gracias y Saludos.
Avatar de Usuario
Altair Auditore
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-08-15 08:57 @414

Publicidad

Re: Por qué este array solo contiene un elemento

Notapor explorer » 2011-08-15 09:33 @440

Bienvenido a los foros de Perl en español, Altair Auditore.

Hay varios problemas en el código, pero el principal es que estás asignando al array @google siempre un único elemento, haciendo perder el valor o valores guardados en el bucle anterior.

Es decir, en la línea 4, le estás indicando que el nuevo valor de @google será un único elemento, que es el valor de $1 capturado en la expresión regular. Cuando el bucle termine, @google solo contendrá un único valor: el de la última captura.

Y, además, no contemplas el caso de que la expresión regular se repita en la misma línea, más de una vez. Solo estás guardando una única coincidencia por línea del fichero asociado a LOGFILE.

Esta es una posible solución:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while(my $line = <LOGFILE>) {
  2.     chomp($line);
  3.     while ( $line =~ m{http://www.google.de/search\?q=(.*[a-z0-9]\b&ie{1}\b)}ig ) {
  4.         push @google, $1;
  5.     }
  6. }
  7.  
  8. foreach $linea (@google) {
  9.     print "$linea\n";
  10. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

  • Hemos cambiado el primer for() por un while(). La diferencia es grande: con el for(), el programa Perl se lee el fichero entero a memoria, mientras que con while(), solo se lee una línea cada vez
  • Hemos cambiado el if() por un while(), para analizar todas las posibles coincidencias a la largo de la $line.
  • Guardamos el valor capturado en @google, con la ayuda de push().

Lo que ya no sé decirte es si el patrón de la expresión regular está bien o no (pero yo apuesto a que no), pues depende de lo que estés buscando.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Por qué este array solo contiene un elemento

Notapor Altair Auditore » 2011-08-15 09:47 @449

¡¡¡Hola, explorer!!!

Muchas Gracias por tu ayuda y por tu tremenda explicación. Me quedó todo muy claro... La verdad, lo que trato de conseguir con la expresión regular son las palabras claves que fueron introducidas en el buscador de Google. Es una forma de practicar y seguir avanzando en mi aprendizaje de Perl... Seguramente como dices el patrón de búsqueda está mal pero con mi poco conocimiento no podría distinguirlo. ¿Podrías decirme qué es lo que está mal?

Gracias...
Saludos...
Avatar de Usuario
Altair Auditore
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-08-15 08:57 @414

Re: Por qué este array solo contiene un elemento

Notapor explorer » 2011-08-15 10:51 @493

Bueno, supongamos que los enlaces son de este estilo:

http://www.google.com/search?q=meego+firm+security&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:es-ES:official&client=firefox-a

entonces la expresión sería (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     while ( $line =~ m{http://www.google.de/search\?q=(.+?)&ie}ig ) {
  2.         push @google, $1;
  3.     }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
si asumimos que después de un 'q=' hay siempre un '&ie'.

En @google vamos guardando las cadenas en la forma meego+firm+security y también con los caracteres especiales codificados en Url encoding.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

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