• Publicidad

Problema con expresión en while

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

Problema con expresión en while

Notapor miguialberto » 2008-07-30 01:54 @120

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:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
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";
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


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:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while(my $line = <LOG_FILE> && $found !=1)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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
miguialberto
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2008-07-28 06:13 @301

Publicidad

Notapor explorer » 2008-07-30 03:21 @181

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
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $line = <LOG_FILE> && $found != 1
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
en realidad estás escribiendo
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $line = (<LOG_FILE> && $found) != 1
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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í
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
(my $line = <LOG_FILE>) && ($found != 1)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
o mejor así
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $line = <LOG_FILE> and $found != 1
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pues 'and' tiene un nivel de precedencia mucho más bajo. O incluso más expresivo
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $line = <LOG_FILE> and !$found
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
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";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Con 'last', el bucle termina inmediatamente.
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 miguialberto » 2008-07-30 03:59 @208

¡Gracias de nuevo!
miguialberto
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2008-07-28 06:13 @301


Volver a Básico

¿Quién está conectado?

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

cron