Perl en Español

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

"comparar" y "encontrar" ?

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Mie Jun 14, 2006 12:26 am
xigr
Perlero Nuevo
Perlero Nuevo
Registrado: 03 Feb 2006
Mensajes: 42
"comparar" y "encontrar" ? Responder citando

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:
@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
Mensaje Mie Jun 14, 2006 1:12 am
pbellon
Perlero Nuevo
Perlero Nuevo
Registrado: 22 Oct 2004
Mensajes: 33
Responder citando

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:
if ($noentro[$indice]=~ /Password/i) {
...

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

Cool
Mensaje Mie Jun 14, 2006 1:42 am
xigr
Perlero Nuevo
Perlero Nuevo
Registrado: 03 Feb 2006
Mensajes: 42
Responder citando

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!!!!
Mensaje Mie Jun 14, 2006 3:18 am
xigr
Perlero Nuevo
Perlero Nuevo
Registrado: 03 Feb 2006
Mensajes: 42
Responder citando

Pues nada.. no se que pasa que no funciona. y en el print sale el texto!
Cita:
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 Sad
Mensaje Mie Jun 14, 2006 5:15 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4084
Ubicación: Valladolid, España
Responder citando

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:
@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:
@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:
@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...
Mensaje Jue Jun 15, 2006 1:49 am
xigr
Perlero Nuevo
Perlero Nuevo
Registrado: 03 Feb 2006
Mensajes: 42
Responder citando

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
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