• Publicidad

Extraer variable de un txt

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

Extraer variable de un txt

Notapor angelruiz » 2009-06-04 15:25 @684

Hola amigos.

Quiero buscar un valor ($ip) dentro de una lista ips.txt; si este IP existe en la lista ejecuto una acción. De lo contrario ejecuto otra.

Creé un archivo ips.txt:
Código: Seleccionar todo
192.168.50.2
192.168.50.3
192.168.50.4
192.168.50.5


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$file= "/partition/practicas/ips.txt";
open(DATOS, "<$file");

my @lineas = <DATOS>;
close(DATOS);

$ip=192.168.50.2
 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 foreach $linea (@lineas) {
                if ($linea == $ip) {
                     print  "Tengo el ip, $ip\n !!!";
                                         }
                else {
                     print  "no tengo ip !!!";
                     }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El problema es que no me da los resultados correctos.

Si por favor me tiran una luz le agradezco.
angelruiz
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2009-06-03 08:33 @398

Publicidad

Notapor explorer » 2009-06-04 16:56 @747

El problema está en el operador de comparación '=='. Ese operador es para comparar números. Pero lo que quieres es comparar son cadenas de caracteres.

Si intentamos comparar IP como si fueren números, te puedes llevar una sorpresa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
explorer@portatil:~> perl -le '$x="192.168.0.1"; if ($x == "192.168") { print "Sí" }'
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

¿Por qué pasa eso? Pues como le has mandado a Perl hacer una comparación numérica, intenta convertir los dos operandos a comparar en números. Así, "192.168.0.1" se "parece" al número 192,168 (sí, un número decimal). Y "192.168" sí que se convierte en 192,168. Entonces, tenemos dos números iguales, y sale un 'Sí'.

Entonces no nos vale la comparación numérica. Debemos usar la comparación de cadenas de caracteres:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
explorer@portatil:~> perl -le '$x="192.168.0.1"; if ($x eq "192.168") { print "Sí" }'
explorer@portatil:~> perl -le '$x="192.168.0.1"; if ($x eq "192.168.0.1") { print "Sí" }'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Debes usar el operador 'eq'.

Pero... atención, que se nos olvida un detalle importante... hay que quitar los caracteres de finales de línea, al leer el fichero de texto.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @lineas = <DATOS>;
chomp @lineas;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Esto es necesario, porque solo nos interesa el valor de IP, no el de la IP más el carácter de fin de línea.

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
explorer@portatil:~/Documents/Desarrollo> perl -le 'open F,"</partition/practicas/ips.txt"; @x=<F>; print "[$x[0]]"'
[192.168.50.2
]
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Observa que hay un avance de línea antes del corchete final. Por eso hay que quitarlos con la función chomp().
Última edición por explorer el 2009-06-05 07:28 @352, editado 1 vez en total
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 angelruiz » 2009-06-05 06:44 @322

Gracias explorer.

Funcionó a la perfección.

Lo del comparador ya lo había cambiado pero nada :oops: Me faltaba chomp @lineas;

Este código es para agregarlo al redirector de squid.

Amigo explorer, muchas gracias. Admiro su trabajo y disponibilidad para ayudar y colaborar. Cuando quieras pasa por el foro http://www.brazilfw.com.br. Todos son bienvenidos.

Saludos.
angelruiz
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2009-06-03 08:33 @398


Volver a Básico

¿Quién está conectado?

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

cron