Ver Mensaje Individual
  #15 (permalink)  
Antiguo 22/03/2005, 12:11
Alextroy
 
Fecha de Ingreso: marzo-2005
Mensajes: 189
Antigüedad: 19 años, 2 meses
Puntos: 0
Seguimos con el formulario....

Mira MonoSwin, este es el documento del que te hablo...

En el momento en el que el usuario pulsa el botón Go, el browser envía al CGI que se indica en el campo ACTION, la variable introducida por el usuario en el campo de texto de la siguiente manera: name=<lo que haya tecleado el usuario en el campo de texto>. Sin embargo el cgi recibe todas las variables en una cadena de caractéres, y todas juntas, por tanto antes de nada hay que recoger esta cadena de caracteres, analizarla y obtener una tabla con la cual a partir del nombre de la variable que se indica en el formulario, podamos obtener el valor. El siguiente listado de Perl se encarga de esta labor.
#!/usr/local/bin/perl
# Según el método de paso de variables obtener la cadena de caracteres con las variables
# Después obtener cada par nombre de variable- valor.
if ($ENV{'REQUEST_METHOD'} eq 'GET')
{
@pairs = split(/&/, $ENV{'QUERY_STRING'});
}
elsif ($ENV{'REQUEST_METHOD'} eq 'POST')
{
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
}
else
{
print "Content-type: text/html\n\n";
print "Something is wrong, take it easy";
}

# Analizar el array de caracters que contiene el par nombre de variable-valor.
# Crear la tabla hash cuyo campo key es el nombre de la variable y el segundo
# campo es el valor
foreach $pair (@pairs)
{
# Separar el nombre de la variable del valor
($key, $value) = split (/=/, $pair);
# Sustituir el + por un espacio en blanco. Normalmente se usa 's' para incicar
# sustitución cuando se quieren utilizar expresiones regulares. Si no se van a
# utilizar expresiones regulares en el patrón de búsqueda, usamos 'tr'

$key =~ tr/+/ /;

# En la cadena de caracteres que nos pasa el servidor web con las variables y
# su valor, los caracteres especiales nos los pasa codificados con un número
# hexadecimal precedido de un caracter '%'. La sentencia siguiente sustituye
# los valores hexadecimales y el % por el caracter que representan. La función # pack se encarga de esa labor. El modificador 'e' al final de la sentencia indica # que el remplazamiento del patrón se va hacer por medio de una función #(pack). El modificador 'g' indica que se busque el patrón en toda la cadena de # caracteres hasta el final
$key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

# Esta espresión se encarga de eliminar cualquier server side include SSI.
$value =~s/<!--(.|\n)*-->//g;

# Creamos la tabla hash formdata y la vamos rellenando.
# Existen variables que pueden tener múltiples valores, por tanto si ya existe
# un valor para un nombre de variable ( if ($formdata($key)) ), entonces
# añadimos al valor el nuevo valor separado por una coma.

if ($formdata{$key})
{
$formdata{$key} .= ", $value";
}
else
{
$formdata{$key} = $value;
}
}
listado 2.
• El listado 2 intenta ser auto-explicativo, incluye comentarios que explican la intención y objetivo de cada sentencia. Un comentario es todo aquello que se encuentra entre un # y un final del línea.
• Para entender bien este listado conviene que te hayas mirado previamente las expresiones regulares en Perl.
• Una vez entendido este código podemos pasar a mostrar el listado del CGI DimeTuNombre, donde se muestra como obtener el valor de una varible, y como comparar el valor de una cadena de caracteres, para finalmente crear una página html de respuesta según en nombre introducido por el usuario.
#!/usr/local/bin/perl
if ($ENV{'REQUEST_METHOD'} eq 'GET')
{
@pairs = split(/&/, $ENV{'QUERY_STRING'});
}
elsif ($ENV{'REQUEST_METHOD'} eq 'POST')
{
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
}
else
{
print "Content-type: text/html\n\n";
print "Something is wrong, take it easy";
}
foreach $pair (@pairs)
{
($key, $value) = split (/=/, $pair);
$key =~ tr/+/ /;
$key =~ s/%([a-fA-F0-9] [a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9] [a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~s/<!--(.|\n)*-->//g;
if ($formdata{$key})
{
$formdata{$key} .= ", $value";
}
else
{
$formdata{$key} = $value;
}

# Comenzamos a escribir la página HTML
print "Content-type: text/html\n\n";
print "<HTML><HEAD><TITLE>Dime Tu Nombre</TITLE></HEAD><BODY>";

# Accedemos al valor de la variable nombre, y comprobamos si el valor de
if ($formdata{'name'} eq 'Alberto')
{
print "<P><B>$formdata{'name'}</B> eres un tio grande";
}
elsif ($formdata{'name'} eq 'Gonzalo')
{
print "<P><B> $formdata{'name'}</B> eres una buena persona";
}
elsif ($formdata{'name'} eq 'Diego')
{
print "<P><B>$formdata{'name'}</B>, yo te conozco.";
}
elsif ($formdata{'name'} eq 'Virginia')
{
print "<P><B>$formdata{'name'}</B> eres una preciosidad";
}
elsif ($formdata{'name'} eq 'Manolo')
{
print "<P><B>$formdata{'name'}</B> eres un gallego, ¿verdad?";
}
else
{
print " No se quien eres";
}
print "</BODY></HTML>";
}
listado 3, DimeTuNombre.
• Como las variables que nos pasa el servidor las guardamos en una tabla hash accedemos a su valor de la forma en que se muestra en el listado 3, $formdata{'name'}, donde name es el nombre la varible de la cual queremos obtener su valor.
• En este listado podéis observar una estructura de control if-elsif-else y el operador de comparación entre cadenas, eq (igual).
• Otro elemento a comentar es el contenido del print, donde informamos al browser que lo que le estamos mandando es texto HTML (Content-type:).


Lo que yo te decia esque me parece una pasada tener que escribir todo esto al comienzo de cada CGI, por eso tengo este lio montado con el tema de los módulos y demás...a ver si tu puedes sacarme de dudas de una vez, que este tema se está alargando ya demasiado y me tiene completamente estancado...