Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Problema con expresión en while

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Mie Jul 30, 2008 12:54 am
miguialberto
Perlero Nuevo
Perlero Nuevo
Registrado: 28 Jul 2008
Mensajes: 28
Problema con expresión en while Responder citando

Hola de nuevo,

Estoy con un programa en Perl que me lee de un fichero en busca de una cadena de caracteres específica en cada una de las líneas. Si encuentra la cadena en el fichero realiza una acción y sino otra. Este es el código:

Perl:
my $msg = "Cadena a buscar";
my $found = 0;

open (LOG_FILE, '<'.$output_file_path);

while (my $line = <LOG_FILE>) {

    if ( $line=~ m/$msg/ ) {
        $found = 1;
    };

}

close(LOG_FILE);

if ($found != 0){
    print "Encontrado cadena en fichero";
}
else {
    print "No he encontrado nada";
}


Este programa me funciona bien. Cuando en el fichero se encuentra la cadena "Cadena a buscar", por pantalla sale "Encontrado cadena en fichero" y sino "No he encontrado nada".

Mi problema viene cuando intento que el bucle del while termine cuando encuentre la cadena que busco. Es decir, si el fichero tiene 1000 líneas y encuentra en la cadena en la primera, que termine para no continuar leyendo.

Así que si pongo:

Perl:
while(my $line = <LOG_FILE> && $found !=1)


En este caso, que se supone que debería parar cuando $found = 1, el bucle continúa y además siempre se me va por el "else", es decir, esté o no esté la cadena que busco en el fichero, me sale siempre por pantalla
"No he encontrado nada".

¿Alguna ayuda por favor?

¡Gracias por adelantado!

Ciao
Mensaje Mie Jul 30, 2008 2:21 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4142
Ubicación: Valladolid, España
Responder citando

El problema está en el '&&'. Es el operador 'y' lógico, pero funciona con un nivel de precedencia mucho más alto de que lo que supones.

La expresión
Perl:
my $line = <LOG_FILE> && $found != 1
en realidad estás escribiendo
Perl:
my $line = (<LOG_FILE> && $found) != 1
y como $found es falso al principio, el resultado de la expresión es siempre que $line contiene un valor fijo, no el valor de la línea leída, por lo que el bucle no se ejecuta bien.

Lo correcto sería escribirlo así
Perl:
(my $line = <LOG_FILE>) && ($found != 1)
o mejor así
Perl:
my $line = <LOG_FILE> and $found != 1
pues 'and' tiene un nivel de precedencia mucho más bajo. O incluso más expresivo
Perl:
my $line = <LOG_FILE> and !$found


Pero... Perl, a diferencia de otros lenguajes, tiene una sintaxis muy rica. Existe la forma exacta de hacer lo que quieres, con solo una primitiva:
Perl:
my $msg = "Cadena a buscar";
my $found = 0;

open(LOG_FILE, "<$output_file_path");

while (my $line = <LOG_FILE>) {
    if ( $line =~ m/$msg/ ) {
        $found = 1;
        last;
    }
}

close(LOG_FILE);

if ( $found ){
    print "Encontrado cadena en fichero";
}
else {
    print "No he encontrado nada";
}

Con 'last', el bucle termina inmediatamente.
Mensaje Mie Jul 30, 2008 2:59 am
miguialberto
Perlero Nuevo
Perlero Nuevo
Registrado: 28 Jul 2008
Mensajes: 28
Responder citando

¡Gracias de nuevo!
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group