• Publicidad

"comparar" y "encontrar" ?

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

"comparar" y "encontrar" ?

Notapor xigr » 2006-06-14 01:26 @102

Buenas, mi problemita es que no logro "comparar" o "encontrar" la palabra que quiero para que de un msg u otro. Lo que hago es etnrar en diferentes equipos, si no entra sigue la parte que pego y como puedo tener dos mensajes de error (por falta de password o por timeout) busco la palabra Password separando por palabras la @salida.

Comprobé que realmente capturara @salida imprimiendolo por pantalla y sí me salía, pero a la hora de la verdad no logro que "encuentre" 'Password' que es la señal que le indicaba yo :s
¿que hago mal?

Código: Seleccionar todo
@salida= $session->waitfor(String => '#');   
$resul=$salida[0];
@noentro = split(/ /, $resul);
for ($indice=0; $indice<= scalar(@noentro)-1; $indice++)
{
    if ($noentro[$indice]=~ /Password/)
    {
       $pq='Password required, but none set';
    }else{
       $pq='Unable To Connect';
    }
}


gracias!
iñaki
xigr
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2006-02-03 02:51 @160

Publicidad

Notapor pbellon » 2006-06-14 02:12 @133

Hola,

Yo he probado tu código y a mi me funciona. Puede que sea un problema de mayúsculas y minúsculas en la expresión regular. Prueba a poner
Código: Seleccionar todo
if ($noentro[$indice]=~ /Password/i) {
...

Prueba si quieres este bucle que desde mi punto de vista es más sencillo.
Código: Seleccionar todo
foreach $i(@noentro) {
    if ($i =~ /Password/i)
    {
        $pq='Password required, but none set';
    }
    else {
        $pq='Unable To Connect';
    }
}

8)
pbellon
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2004-10-22 06:48 @325

Notapor xigr » 2006-06-14 02:42 @154

gracias!! voy a probar a ver que me sale. me aseguré que "Password" fuera escrito así pero no sé si es que tendrá algún espacio o que.. nosé... a ver. gracias!!!!
xigr
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2006-02-03 02:51 @160

Notapor xigr » 2006-06-14 04:18 @221

Pues nada.. no se que pasa que no funciona. y en el print sale el texto!
telnet
10.96.168.237
Trying
10.96.168.237
...
Open


Password
required,
but
none
set

[Connection
to
10.96.168.237
closed
by
foreign
host]
y luego termina diciendome "No puedo entrar en el equipo: 10.96.168.237 porque "Unable To Connect"

No entiendo porque no me funciona :(
xigr
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2006-02-03 02:51 @160

Notapor explorer » 2006-06-14 06:15 @302

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...
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 xigr » 2006-06-15 02:49 @159

buenas!!

muchísimas gracias explore, me ha quedado todo clarísimo. te planteas ser profesor y dar clases? jejeje muchas gracias!!!

y si, el segundo mensaje contiene timeout jejeje


saludos,
iñaki
xigr
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2006-02-03 02:51 @160


Volver a Básico

¿Quién está conectado?

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