El problema está en el bucle y en el if.
Tu lo que quieres es que cuando se encuentre la palabra Password, sepamos que el password estaba mal. Y eso es lo que tienes en tu bucle. Llega al if, comprueba que es un Password, asigna el valor a la variable $pq y listo... pero no... no porque el bucle ¡continúa! con la siguiente palabra que hay en @noentro. Y como la siguiente palabra seguro que ya no es la palabra Password, por efecto del else, $pq adquiere un nuevo valor, distinto del que quieres.
Lo que tenemos que hacer es parar el bucle en cuanto sepamos que hemos encontrado lo que queremos.
- Código: Seleccionar todo
@salida= $session->waitfor(String => '#');
$result = $salida[0];
@noentro = split(/ /, $resul);
foreach $palabra ( @noentro ) {
if ($palabra =~ /(Password|Timeout)/ ) { # Encontrado!
if ( $1 eq 'Password' ) {
$pq = 'Password required, but none set';
} else {
$pq = 'Unable To Connect';
}
last;
}
}
print $pq;
Explicación:
En el primer if buscamos con una expresión regular la palabra Password o (
|) la palabra Timeout. Si la encontramos, Perl nos la guarda en la variable $1 gracias a los paréntesis.
Si sí la hemos encontrado, con el segundo if ponemos el valor de $pq al mensaje que queremos poner.
Y lo importante: hacemos un
last;. Es decir, SALIMOS del bucle inmediatamente, ya que no es necesario seguir mirando más palabras.
Otra forma de hacerlo es así:
- Código: Seleccionar todo
@salida= $session->waitfor(String => '#');
foreach ( split / /, $salida[0] ) {
if ( /(Password|Timeout)/ ) {
$pq = ( $1 eq 'Password' ) ?
'Password required, but none set' :
'Unable To Connect' ;
last;
}
}
print $pq;
usando el operador '?' para reducir el if y la asignación.
Otra forma:
- Código: Seleccionar todo
@salida= $session->waitfor(String => '#');
foreach ( split / /, $salida[0] ) {
$pq = 'Password required, but none set', last if /Password/;
$pq = 'Unable To Connect' , last if /Timeout/;
}
print $pq;
Aquí, lo que hacemos es asignar el valor a $pq y salir con last si la palabra que buscamos coincide con alguna de las expresiones regulares. Hemos hecho dos cosas: hemos puesto el if al final de la línea y estamos usando la variable $_ (valor por defecto) en todas las líneas. En el bucle foreach no asignamos la palabra a analizar a ninguna variable, por lo que queda almacenada en $_. Y esa es justo la variable que se utiliza con las expresiones regulares en los if. Por eso la quitamos, por.. 'sobreentendida'.
Naturalmente, he supuesto que el segundo mensaje de error contenía la palabra Timeout...