Mie Jun 14, 2006 12:26 am
|
 |
xigr
Perlero Nuevo

|
Registrado: 03 Feb 2006
Mensajes: 42
|
|
| "comparar" y "encontrar" ? |
|
|
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 |
|
|
|

Mie Jun 14, 2006 1:12 am
|
 |
pbellon
Perlero Nuevo

|
Registrado: 22 Oct 2004
Mensajes: 33
|
|
|
|
|
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';
}
} |
 |
|
Mie Jun 14, 2006 1:42 am
|
 |
xigr
Perlero Nuevo

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

|
Registrado: 03 Feb 2006
Mensajes: 42
|
|
|
|
|
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  |
|

Mie Jun 14, 2006 5:15 am
|
 |
explorer
Moderador

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

Jue Jun 15, 2006 1:49 am
|
 |
xigr
Perlero Nuevo

|
Registrado: 03 Feb 2006
Mensajes: 42
|
|
|
|
|
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 |
|
Powered by phpBB © 2001, 2005 phpBB Group
|