Mie Jul 30, 2008 12:54 am
|
 |
miguialberto
Perlero Nuevo

|
Registrado: 28 Jul 2008
Mensajes: 28
|
|
| Problema con expresión en while |
|
|
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 |
|
|
|

Mie Jul 30, 2008 2:21 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4142
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|

Mie Jul 30, 2008 2:59 am
|
 |
miguialberto
Perlero Nuevo

|
Registrado: 28 Jul 2008
Mensajes: 28
|
|
|
|
|
| ¡Gracias de nuevo! |
|
Powered by phpBB © 2001, 2005 phpBB Group
|