• Publicidad

Cómo guardar variable en un arreglo

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

Cómo guardar variable en un arreglo

Notapor jrscatman » 2011-11-17 17:12 @758

Hola.

¿Me podrían ayudar? Necesito guardar una cadena en un arreglo, pero no me está funcionando la forma que estoy utilizando ya que solo me guarda un valor de n cantidad de valores que quiero guardar.

Lo que quiero hacer es guardar algunas IP que estoy leyendo de un archivo a las cuales les hago un if() para que cumplan una condición y si la cumplen guardarlo en un arreglo para después imprimirlas.

Utilizo algo así pero no me funciona.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ( $valida_ip eq $ip ) {
  2.     push( @ip_duplicadas, $_ );
  3. }
  4. else {
  5.     push( @ip_correctas, $_ );
  6. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


¿Qué debo hacer para poder guardar todas las IP en cada arreglo...?

Saludos...


Salud
jrscatman
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-10-18 19:24 @850

Publicidad

Re: Cómo guardar variable en un arreglo

Notapor explorer » 2011-11-17 20:26 @893

Bienvenido a los foros de Perl en español, jrscatman.

Si la variable $_ almacena la IP, entonces no hay problema... se van guardando en los array.

Falta algo más de código para darte una respuesta, pero... ¿no es $ip la variable que almacena la IP? En ese caso debes cambiar las $_ por $ip.
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

Re: Cómo guardar variable en un arreglo

Notapor jrscatman » 2011-11-18 11:44 @530

Hola, explorer. Mira, te comento: estoy haciendo un pequeño cgi que haga algunas validaciones de IP duplicadas y otras cosas. Lo primero que hago es solicitar un csv donde contenga la siguiente información:

ip,hostname,comunidad_RO

Ese archivo csv lo guardo en un servidor y lo empiezo a leer para buscar las IP duplicadas.

Pero los datos me los imprime de una forma no muy adecuada. Mira este es programa que tengo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use CGI;
  4.  
  5. # Lee la IP del NNM
  6. my $q = new CGI;
  7. $nnmi_ip = $q->param("nnmi");
  8.  
  9. # Guarda archivo cargado
  10. $upload_dir = "/var/www/html/validacion/nodos/";
  11. $query      = new CGI;
  12. $filename   = $query->param("file");
  13. $filename =~ s/.*[\/\\](.*)/$1/;
  14. $upload_filehandle = $query->upload("file");
  15. open UPLOADFILE, ">$upload_dir/$filename";
  16. while (<$upload_filehandle>) {
  17.     print UPLOADFILE;
  18. }
  19. close(UPLOADFILE);
  20.  
  21. # Lee el archivo cargado
  22. open FILEHANDLE, "/var/www/html/validacion/nodos/$filename";
  23. while (<FILEHANDLE>) {
  24.     next if ( /^$/ || /^#/ );
  25.     chomp();
  26.     my @line      = split(/,/);
  27.     my $ip        = $line[0];
  28.     my $host_name = $line[1];
  29.     my $comunidad = $line[2];
  30.  
  31.     # Valida que la Ip no este duplicada en NNM
  32.     my $guarda_ip
  33.         = system(
  34.         "/opt/PostgreSQL/9.1/bin/psql -h $nnmi_ip -U postgres -d nnm < /tmp/query1.sql | sed 's/ //' > /tmp/nms_ip_addr"
  35.         );
  36.     my $valida_ip = qx( more /tmp/nms_ip_addr | grep $ip);
  37.     chomp($valida_ip);
  38.     if ( $valida_ip eq $ip ) {
  39.         print "Content-type:text/html\n\n";
  40.         print "<html>\n";
  41.         print "<body>\n";
  42.         print "<h4>IP Duplicada</h4>\n";
  43.         print "<h4>$valida_ip</h4>\n";
  44.     }
  45.     else {
  46.         print "Content-type:text/html\n\n";
  47.         print "<html>\n";
  48.         print "<body>\n";
  49.         print "<h4>IP Correctas</h4>\n";
  50.         print "<h4>$ip</h4>\n";
  51.     }
  52. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Quisiera saber cómo puedo hacer para que la validación que hace en el if() y el else() se pueda guardar en una variable que después pueda yo mandar imprimir fuera del segundo while().

Saludos.
Última edición por explorer el 2011-11-18 11:57 @539, editado 1 vez en total
Razón: Marcas de código Perl
jrscatman
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-10-18 19:24 @850

Re: Cómo guardar variable en un arreglo

Notapor explorer » 2011-11-18 12:20 @556

Lo mejor que puedes hacer es sacar las líneas comunes y de cabecera fuera del bucle. Es decir, las líneas
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
        print "Content-type:text/html\n\n";
        print "<html>\n";
        print "<body>\n";
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
las dejas reducidas a un solo grupo, y lo colocas antes del while(), pues solo deben ser impresas una sola vez.

Luego, dentro del while(), según sea el if() o el else, imprimes lo que quieras (de código HTML, claro). Y después del bucle while(), cierras la página:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
print "</body>\n";
print "</html>\n";
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
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

Re: Cómo guardar variable en un arreglo

Notapor jrscatman » 2011-11-18 12:40 @569

Creo que no me he explicado bien. Mira: lo que necesito es guardar dentro de un arreglo las IP que pasen dentro de la validación del if() y el else(), para que después del segundo while() pueda yo mandar a imprimir esas IP. Pero lo que pasa es que no puedo guardar esas IP. No sé cómo hacerlo...

Mira: he probado hacerlo de esta manera pero no me funciona; no imprime nada; solo imprime esto:

IPs Duplicadas
Ips Correctas


Código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use CGI;
  4.  
  5. # Lee la IP del NNM
  6. my $q = new CGI;
  7. $nnmi_ip = $q->param("nnmi");
  8.  
  9. # Guarda archivo cargado
  10. $upload_dir = "/var/www/html/validacion/nodos/";
  11. $query      = new CGI;
  12. $filename   = $query->param("file");
  13. $filename =~ s/.*[\/\\](.*)/$1/;
  14. $upload_filehandle = $query->upload("file");
  15. open UPLOADFILE, ">$upload_dir/$filename";
  16. while (<$upload_filehandle>) {
  17.     print UPLOADFILE;
  18. }
  19. close(UPLOADFILE);
  20.  
  21. # Lee el archivo cargado
  22. open FILEHANDLE, "/var/www/html/validacion/nodos/$filename";
  23. while (<FILEHANDLE>) {
  24.     next if ( /^$/ || /^#/ );
  25.     chomp();
  26.     my @line      = split(/,/);
  27.     my $ip        = $line[0];
  28.     my $host_name = $line[1];
  29.     my $comunidad = $line[2];
  30.  
  31.     # Valida que la Ip no este duplicada en NNM
  32.     my $guarda_ip
  33.         = system(
  34.         "/opt/PostgreSQL/9.1/bin/psql -h $nnmi_ip -U postgres -d nnm < /tmp/query1.sql | sed 's/ //' > /tmp/nms_ip_addr"
  35.         );
  36.     my $valida_ip = qx( more /tmp/nms_ip_addr | grep $ip);
  37.     chomp($valida_ip);
  38.     if ( $valida_ip eq $ip ) {
  39.         push( @ip_duplicadas, $valida_ip );
  40.     }
  41.     else {
  42.         push( @ip_correctas, $ip );
  43.     }
  44. }
  45. print "Content-type:text/html\n\n";
  46. print "<html>\n";
  47. print "<head><title>Display File</title></head>\n";
  48. print "<body>\n";
  49. print "<h4>IPs Duplicadas</h4>\n";
  50. print "<h4>@ip_duplicadas</h4>\n";
  51. print "<h4>IPs Correctas</h4>\n";
  52. print "<h4>@ip_correctas</h4>\n";
  53. print "</body>\n";
  54. print "</html>\n";
  55.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
jrscatman
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-10-18 19:24 @850

Re: Cómo guardar variable en un arreglo

Notapor explorer » 2011-11-18 18:59 @833

Sigo sin ver nada... Por eso los pragmas son tan útiles, porque pueden ver cosas que a los humanos se nos escapan.

Sobre todo, con use strict y use warnings, que pillan muchos errores.

No veo nada raro, salvo... quizás... que los dos array están vacíos porque... no se ha entrado en el bucle while() de la línea 23.
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

Re: Cómo guardar variable en un arreglo

Notapor jrscatman » 2011-11-22 13:02 @585

Ok... ¿y cómo puedo solucionar eso para que los arreglos no estén vacíos y pueda yo imprimir el contenido de estos?

¿Me podrías ayudar por favor...?
jrscatman
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-10-18 19:24 @850

Re: Cómo guardar variable en un arreglo

Notapor explorer » 2011-11-22 16:04 @711

Sin usar los array, ¿sí que salen las IP?
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 0 invitados

cron