• Publicidad

Duda de tratamiento de formulario con Perl

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

Duda de tratamiento de formulario con Perl

Notapor New_Perl » 2010-11-10 12:32 @564

Buenas tardes.

A ver si alguien me puede echar una mano. Estoy comenzando con Perl, tanto que llevo dos días y ando bastante perdido todavía... ¡ja,ja,ja!

Tengo que acceder a una base de datos SQLite. Esta base de datos tan sólo tiene una tabla y dos campos, que es un nombre de una ciudad y un código. Lo siguiente que tengo que hacer es mostrar las ciudades en un campo select por medio de una template. Esto es lo que tengo hecho hasta ahora:

-cgi.pl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!"C:\perl\bin\perl.exe"
  2.  
  3. use DBI;
  4. use CGI;
  5. use HTML::Template;
  6.  
  7. $cgi = CGI->new;
  8. $t = HTML::Template->new(filename => 'plantilla.tmpl');
  9. $dbh = DBI->connect("dbi:SQLite:municipios.db") || die "Cannot connect:
  10.  
  11. $DBI::errstr";
  12.  
  13. $t->param(MUNICIPIOS => $dbh->selectall_arrayref('SELECT * FROM municipios', { Slice => {} }));
  14.  
  15. $dbh->disconnect;
  16.  
  17. print $cgi->header;
  18. print $t->output;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


-plantilla.tmpl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html>
  3. <head>
  4.         <title>Municipios</title>
  5. </head>
  6. <body>
  7.         <form action="meteo.pl" method="post">
  8.         <select name="municipios" size="1">
  9.         <TMPL_LOOP NAME=MUNICIPIOS>
  10.         <option value="<TMPL_VAR NAME=codigo>"><TMPL_VAR NAME=nombre></option>
  11.         </TMPL_LOOP>
  12.         </select>
  13.         <input type=submit value="Aceptar">
  14. </body>
  15. </html>
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Eso es lo que tengo hecho para mostrar las ciudades y poner en el value su código. Ahora lo que quiero es poder recoger en el cgi que lo procesa (meteo.pl), una variable con el código de la ciudad que haya seleccionado antes de darle al botón Aceptar, pero no sé recoger una variable de ahí. ¿Alguien me puede echar una mano?

Muchas gracias :wink: :wink: :wink:
New_Perl
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2010-11-10 11:24 @517

Publicidad

Re: Duda de tratamiento de formulario con Perl

Notapor explorer » 2010-11-10 12:39 @568

Bienvenido a los foros de Perl en Español, New_Perl.

Con el método param() del objeto $cgi puedes acceder a los parámetros pasados por el formulario.

Tienes un ejemplo en mi CGI mínimo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Duda de tratamiento de formulario con Perl

Notapor New_Perl » 2010-11-10 12:52 @578

¡Ja,ja,ja,ja! ¡¡Qué rapidez en contestar!!
¡¡¡Muchas gracias!!!

Le he echado un vistazo pero no lo he terminado de entender del todo.
A ver, yo en el cgi meteo.pl tengo esto:

-meteo.pl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!"C:\perl\bin\perl.exe"
  2.  
  3. use CGI;
  4. use HTML::Template;
  5.  
  6. $cgi = CGI->new;
  7.  
  8. $cgi->param('codigo');
  9. $t = HTML::Template->new(filename => 'p.tmpl', associate => + $cgi);
  10.  
  11. print $cgi->header;
  12. print $t->output;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


No sé si es a eso a lo que te refieres, pero es que no sé cómo traer el código de la ciudad que he elegido a meteo.pl.

Muchas gracias :)
New_Perl
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2010-11-10 11:24 @517

Re: Duda de tratamiento de formulario con Perl

Notapor explorer » 2010-11-10 13:31 @604

Se puede hacer de varias formas.

La primera es indicando a HTML::Template el objeto $cgi, para que sea él el que se encargue de leer los argumentos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $t = HTML::Template->new(filename => 'p.tmpl', associate => $cgi);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


que es la forma larga de
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $t = HTML::Template->new(filename => 'p.tmpl');
  2. $t->param('codigo', $cgi->param('codigo'));
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Esta segunda forma indica exactamente qué parámetros estamos recibiendo desde el $cgi y qué parámetros se meten en la plantilla.

En cambio, la primera forma, será el propio objeto HTML::Template quien se encargue de buscar todos los parámetros que la plantilla tiene, y recuperarles desde $cgi.

Yo, por defecto, siempre uso la segunda forma, pero la primera es muy cómoda y ahorra muchísimo código.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Duda de tratamiento de formulario con Perl

Notapor New_Perl » 2010-11-11 03:25 @184

No termina de funcionarme :(

Vamos a ver, en resumen, estos son mis archivos con el código:

-cgi.pl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!"C:\perl\bin\perl.exe"
  2.  
  3. use DBI;
  4. use CGI;
  5. use HTML::Template;
  6.  
  7. $cgi = CGI->new;
  8. $t = HTML::Template->new(filename => 'plantilla.tmpl');
  9. $dbh = DBI->connect("dbi:SQLite:municipios.db") || die "Cannot connect: $DBI::errstr";
  10.  
  11. $t->param(MUNICIPIOS => $dbh->selectall_arrayref('SELECT * FROM municipios', { Slice => {} }));
  12.  
  13. $dbh->disconnect;
  14.  
  15. print $cgi->header;
  16. print $t->output;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


-plantilla.tmpl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html>
  3. <head>
  4.         <title>Municipios</title>
  5. </head>
  6. <body>
  7.         <form action="meteo.pl" method="post">
  8.         <select name="municipios" size="1">
  9.         <TMPL_LOOP NAME=MUNICIPIOS>
  10.         <option value="<TMPL_VAR NAME=codigo>"><TMPL_VAR NAME=nombre></option>
  11.         </TMPL_LOOP>
  12.         </select>
  13.         <input type=submit value="Aceptar">
  14. </body>
  15. </html>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


-meteo.pl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!"C:\perl\bin\perl.exe"
  2.  
  3. use CGI;
  4. use HTML::Template;
  5.  
  6. $cgi = CGI->new;
  7.  
  8. my $t = HTML::Template->new(filename => 'p.tmpl');
  9. $t->param('codigo', $cgi->param('codigo'));
  10.  
  11. print $cgi->header;
  12. print $t->output;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


-p.tmpl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html>
  3. <head>
  4.         <title>Municipios</title>
  5. </head>
  6. <body>
  7.         <h1>El código es <TMPL_VAR NAME=codigo></h1>
  8. </body>
  9. </html>
  10.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y lo que quiero es que cuando me cargue la plantilla p.tmpl, se muestre el código que elijo en el Select de la primera plantilla al darle a aceptar, pero no me sale.

Otra duda que tengo es que no sé qué diferencia hay entre crear una variable con el 'my' y sin él. Y ya, puestos a preguntar, si estos métodos son equivalentes:

$t->param('codigo', $cgi->param('codigo'));
y
$t->param(codigo => $cgi->param('codigo'));

Muchísisimas gracias por tu ayuda :wink:

¡¡Un saludo!!
New_Perl
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2010-11-10 11:24 @517

Re: Duda de tratamiento de formulario con Perl

Notapor explorer » 2010-11-11 03:51 @202

El resultado del select se deja en el parámetro 'municipios', no 'codigo'. Fíjate bien que es 'municipios' el nombre del select.

Sería $t->param('codigo', $cgi->param('municipios'));

Recuerda que si ejecutas param() en contexto lista, obtienes la lista de todos los parámetros devueltos por el cgi:

print param();

En cuanto a lo del '=>'... bueno, sí, un '=>' sí que es igual a una ',' (de hecho, se suele llamar "supercoma"), pero no es recomendable usarlo de esa manera. Es bonito, visualmente, pero no deja de ser una coma muy gorda.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Duda de tratamiento de formulario con Perl

Notapor New_Perl » 2010-11-11 06:48 @325

¡De acuerdo! ¡¡Problema solucionado!!

¡Muchas gracias!! ¡¡Eres una máquina!! :wink: :)

P.D.: ¿Qué diferencia hay entre crear una variable con el 'my' delante y sin él?
New_Perl
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2010-11-10 11:24 @517

Re: Duda de tratamiento de formulario con Perl

Notapor explorer » 2010-11-11 07:54 @371

Con el my() declaras a la variable como local en el contexto donde te encuentres, lo cual es muy útil a la hora de crear variables que solo vas a necesitar en un trozo pequeño del código. Soluciona el problema de tener un montón de variables globales, y tener que acordarse de cómo se llamaban.

Si no pones my(), estás declarando la variable como global.

Así, por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my $var = 'hola';
  4.  
  5. print "Antes [$var]\n";
  6.  
  7.  
  8. for my $var ( 'adios', 'buenos dias', 'un saludo' ) {
  9.  
  10.     if ($var eq 'buenos dias') {
  11.         my $var = 'sorpresa';
  12.  
  13.         print "\t\t[$var]\n";
  14.     }
  15.  
  16.     print "\t[$var]\n";
  17.  
  18. }
  19.  
  20. print "Después [$var]\n";
  21.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Usamos my() en diversos puntos, para declarar la variable $var. En cada uno de ellos, es local a ese contexto (el par de llaves). Y no es conocida fuera de ese contexto.

Sin mirar la solución, más abajo, es interesante que intentes averiguarlo por ti mismo.

Más información en perldoc -f my







Solución:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Antes [hola]
        [adios]
                [sorpresa]
        [buenos dias]
        [un saludo]
Después [hola]
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: 14480
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: No hay usuarios registrados visitando el Foro y 11 invitados