Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
51
Programación Web
Lic. Mario Francisco Fonseca Lozada
Reporte:
Procesamiento de un formulario mediante un script CGI programado en Perl.
Equipo:
Los Tuxs
Ing en Sistemas Computacionales.
Bravo Zacarías Wiliam Iván.
De Los Santos Gomez Laura Jesús.
Mario Alberto Trujillo Martinez
Tapachula de Coordova y Ordoñes Chiapas a 13 de Abril de 2010.
Índice.
OBJETIVO DE LA PRÁCTICA.
MARCO TEÓRICO.
¿Que es un CGI?
Funciones.
Variables CGI estándar.
Variables acerca del usuario.
Variables acerca de servidor.
Variables específicas de solicitud.
Cabeceras HTTP.
Peticiones en HTTP.
Método GET.
La variable de ambiente QUERY_STRING en solicitudes GET.
Método POST.
Formulario en HTML.
Manejo de Shell en sistemas tipo Unix.
Perl.
Programación en Perl.
DESARROLLO INSTALACIÓN, CONFIGURACIÓN Y PRUEBAS.
Servidor web.
Soporte del servidor web configuración.
Perl.
Programación de CGI.
Ejecución CGI.
OBJETIVO DE LA PRÁCTICA.
MARCO TEÓRICO.
¿Que es un CGI?
CGI ( Common Gateway Interfaz) o Interfaz Común de Puerta de Enlace es la interfaz entre
el servidor HTTP del sitio web y los demás recursos, como los programas CGI, de la
computadora host del servidor. Un CGI es un conjunto de variables y convenciones, de
denominación común, para pasar información de ida y vuelta al servidor.
Funciones.
Un programa CGI tiene tres funciones básicas de entrada/salida:
1. Recabar información del servidor, en forma de variables estandarizadas, datos de
formularios y datos de consulta.
2. Proporcionar de salida al cliente( browser o navegador web).
3. Proporcionar información de negociación del contenido (el encabezado MIME) para
el servidor y el cliente.
Variables CGI estándar.
Los programas CGI se ejecutan en un ambiente diferentes a muchos otros programas, es
decir, no tienen una entrada de flujo estándar por lo que no se pueden manejar de igual
manera.
En CGI, la mayor parte de entrada se pasa en variables de ambiente, que son establecidas
por el servidor HTTP. Algunas de estas variables son estándares de la especificación CGI;
otras son las del navegador web, servidores y sitios particulares, así como de otros factores.
Variables acerca del usuario.
Las variables de ambiente más útiles para obtener información del usuario y su ambiente
son: HTTP_USER_AGENT, HTTP_ACCEPT, REMOTE_HOST y REMOTE_ADDR.
HTTP_USER_AGENT: Esta variable contiene información sobre el nombre y versión del
navegador web del usuario, en el formato “nombre/versión biblioteca/versión”.
HTTP_ACCEPT: Esta variable proporciona los formatos MIME que puede aceptar el
navegador web. El formato de la cadena HTTP_ACCEPT es tipo/subtipo, tipo/subtipo,
tipo/subtipo, [ , , , ] . Por ejemplo: image/jpeg, image/gif, video/mpge, etc.
REMOTE_HOST y REMOTE_ADDR: Estas variables contienen información acerca de la
dirección IP del usuario. REMOTE_ADDR contiene la dirección IP en notación decimal
punteada. La variable REMOTE_HOST contiene el nombre en texto del host equivalente a
la dirección numérica.
Variables acerca de servidor.
Las siguientes variables contienen información acerca del servidor y software que éste
ejecuta:
SERVER_SOFTWARE: Contiene el nombre y versión del software del servidor, en el
formato nombre/versión.
SERVER_NAME: Contiene el nombre del host del servidor, los alias DNS o la dirección
IP, que se usan para construir URLs autoreferenciales. Este no siempre es el nombre
principal del servidor.
GATEWAY_INTERFAZ: Contiene las versiones de la especificación CGI que utiliza este
servidor, en el formato CGI/revisión.
Variables específicas de solicitud.
Las siguiente variables son específicas de solicitud, ya que cambian según la solicitud
especifica que envíe. Además de éstas, las variables específicas de usuario también son
especificas de solicitud:
QUERY_STRING: Es el método más común para pasar información a un programa CGI,
utilizando el método de solicitud GET.
SCRIPT_NAME: Esta establece al nombre de archivo del programa CGI y la ruta donde se
encuentra.
SERVER_PROTOCOL: Contiene en nombre y número de revisión del protocolo del cual
viene la solicitud. Está en formato protocolo/revisión.
SERVER_PORT: Es el número del puerto al cual llegó la solicitud. El puerto estándar es el
puesto 80.
CONTENT_TYPE: Esta variable se llena cuando contiene información adjunta, es utilizada
por las solicitudes POST. Es el tipo de contenido MIME de los datos, en la forma
tipo/subtipo.
CONTENT_LENGTH: Es el número de bytes de datos, trabaja en conjunto con la variable
CONTENT_TYPE en solicitudes POST.
AUTH_TYPE: Se utiliza para autentificar un usuario. Contiene el método de autenticación
utilizado para validar al usuario.
REQUEST_METHOD: Es el método utilizado para la solicitud. Especifica dónde y cómo
buscar cualquier dato que pase. El método por lo general es GET o POST.
Cabeceras HTTP.
Las cabeceras HTTP mas importante, pues son usados con frecuencia en la programación
de CGIs, son:
Cabecera Descripción
Contenttype: Es una cadena MIME que define el formato de el archivo que va
a ser regresado al cliente.
Expires:Fecha en string La fecha en la cual la información se vuelve invalida. Se usa en
el navegador para decidir cuando una pagina necesita ser
refrescada.
Location: String URL El URL al que debe ser regresado en lugar de la URL
solicitado. Es usado para redireccionar una solicitud a algún
archivo.
Lastmodified: String La fecha de la ultima modificación de el recurso.
Contentlength: String El tamaño, en bytes, de los datos a ser regresados.
Peticiones en HTTP.
Las peticiones en HTTP pueden realizarse usando dos métodos. El GET o POST.
Método GET.
El método GET envía los parámetros junto a la petición, las enviaría codificadas en la
URL. Cuando el navegador web envía la solicitud, cualquier dato del formulario pasa como
parte del URL junto con la solicitud. Cuando se utiliza este método se reciben los datos del
formulario en la variable QUERY_STRING y la variable REQUEST_METHOD contendrá
la palabra GET.
La variable de ambiente QUERY_STRING en solicitudes GET.
La variable QUERY_STRING se formatea como flujo de pares nombre=valor, separador
por el signo ampersand(&). La parte nombre viene directamente de la etiqueta INPUT en el
documento HTML (formulario).
Para codificar los parámetros como parte de la URL, éstos se añaden a la URL detrás del
nombre del recurso, separados de éste por un carácter ?. Los diferentes parámetros se
separan entre sí por el carácter &. Los espacios se sustituyen por +. Por último, los
caracteres especiales ( &, + y ?, así como los caracteres no imprimibles, etc.) se representan
con %xx, donde xx representa al código ASCII en hexadecimal del carácter. Así, solo los
caracteres alfanuméricos, los especiales “ $_.+!*'(), ” y los reservados usados para
propósitos reservados, pueden sin codificación dentro del URL.
Para descifrar los datos del formulario es cuestión de dividir las partes nombre y valor de la
cadena, y reemplazarlas después de cada uno de los indicadores que haya dentro de la
cadena por los datos textuales.
Método POST.
A diferencia del método GET el método POST no envía los parámetros a través del URL,
más bien en caso de enviarlos, lo hace como parte del cuerpo de la petición. El método
GET utiliza la variable ambiente QUERY_STRING para pasar los parámetros a un
programa CGI, en método POST pasa los mismo datos, en el mismo formato, usando el
flujo “de entrada” (stdin).
Al enviar una solicitud POST la variable ambiente QUERY_STRING se muestra vacía,
pero CONTENT_TYPE y CONTENT_LENGTH están llenas. CONTENT_TYPE contiene
el tipo MIME de los datos del formulario que pasa al programa CGI y
CONTENT_LENGTH contiene el número de bytes de ese flujo de datos.
Formulario en HTML.
Los formularios se producen mediante la cooperación de elementos tanto de HTML como
de CGI. El programa CGI se encarga del procesamiento de datos y se usa HTML para
presentar el formulario a los lectores mediante el navegador web utilizado por el cliente.
En HTML, los formularios se producen mediante la etiqueta <FORM>, su sintaxis es:
<FORM ACTION={url} METHOD={método de solicitud}>
Cualquier código valido HTML dentro de una etiqueta FORM.
<INPUT [TYPE=”text”] NAME={nombre} [SIZE={tamaño}] [VALUE={por default}]
[MAXLENGTH={tamaño máximo}]>
<INPUT [TYPE=”radio”] NAME={nombre} [VALUE={valor}] [CHECKED]>
<INPUT [TYPE=”hidden”] NAME={nombre} [VALUE={valor}] >
<INPUT [TYPE=”submit”] [NAME={nombre}] [VALUE={nombre de la etiqueta}] >
<INPUT [TYPE=”reset”] [VALUE={nombre de la etiqueta}] >
<SELECT NAME={nombre} [SIZE={tamaño}] [MULTIPLE] >
<OPTION [SELECTED] [VALUE={valor}] >{texto}
[ <OPTION [SELECTED] [VALUE={valor}] >{texto} ... ]
</SELECT>
</FORM>
Generalmente al declarar la etiqueta <FORM> se declara el método de solicitud en el
atributo METHOD con el que trabaja el CGI e indica donde se encuentra el CGI que
procesa el formulario en el atributo ACTION, el atributo ACTION envía la información
donde se le indica por medio del URL cuando se realiza un evento en el INPUT de tipo
submit.
Manejo de Shell en sistemas tipo Unix.
Comandos basicos para el manejo de shell en sistemas operativos tipo unix ya sea algun
sabor BSD (FreeBSD, NetBSD, OpenBSD, etc) o alguna distribución GNU/Linux (Debian,
RedHat, Suse, Gentoo, etc) , solaris, Mac OS X, entre otros.
cd: cambio de directorio (change directory), cambias al directorio especifico, el cual puede
ser una ruta absoluta o una ruta parcial, ejemplo:
Cambia del directorio actual al directorio que se encuentra en ese mismo directorio, en este
caso el directorio llamado Documentos.
iori@wii:~$ cd Documentos/
iori@wii:~/Documentos$
También se le puede dar la ruta absoluta de la ubicación del directorio Documento, esta se
establece desde la raíz con el símbolo / , ejemplo:
iori@wii:~/Documentos$ cd /home/iori/Documentos/
iori@wii:~/Documentos$
Para ascender a la carpeta contenedora del directorio se utiliza el comando cd .. (con
espacio intermedio), ejemplo:
iori@wii:~/Documentos$ cd ..
iori@wii:~$
Nota: cuando el prompt muestra el símbolo ~$ , indica que se encuentra en el directorio
home/ o /home/usuario/
ls: listar (list), lista los archivos dentro de determinado directorio, ejemplo:
iori@wii:~$ ls
amsn_received Descargas Escritorio hola.pl Música Plantillas prueba.sh~ Videos
bash Documentos examples.desktop Imágenes perl prog_perl Público
iori@wii:~$
Para saber los permisos que tiene determinado archivo se usa la variante “ls l “.si la
primera letra es una “d” indica que es un directorio, o si es un “” indica que es un archivo,
iori@wii:~$ ls l
total 56
drwx 2 iori iori 4096 20100319 00:44 amsn_received
drwxrxrx 2 iori iori 4096 20100406 23:57 bash
drwxrxrx 4 iori iori 4096 20100324 11:12 Descargas
drwxrxrx 3 iori iori 4096 20100409 12:20 Documentos
drwxrxrx 9 iori iori 4096 20100408 13:49 Escritorio
rwrr 1 iori iori 167 20100318 22:54 examples.desktop
rwrr 1 iori iori 39 20100322 10:20 hola.pl
drwxrxrx 3 iori iori 4096 20100403 19:05 Imágenes
drwxrxrx 2 iori iori 4096 20100403 17:55 Música
drwx 4 iori iori 4096 20100407 23:31 perl
drwxrxrx 2 iori iori 4096 20100318 23:12 Plantillas
drwxrxrx 2 iori iori 4096 20100407 22:00 prog_perl
rwrr 1 iori iori 0 20100406 23:28 prueba.sh~
drwxrxrx 2 iori iori 4096 20100318 23:12 Público
drwxrxrx 2 iori iori 4096 20100318 23:12 Videos
En el cual se dividen tres grupos de tres letras, el primer grupo de tres letras pertenece al
usuario del archivo o directorio, el segundo grupo de tres letras pertenece al grupo y el
ultimo grupo de tres letras pertenece a otros usuarios; la letra r indica que tiene permiso de
lectura, la letra w indica que tiene permiso de escritura y la x indica que tiene permiso de
ejecución; si existe un guión () es la ausencia del permiso, los permisos van en el siguiente
orden: rwx.
touch: Crea un nuevo archivo en el directorio especificado.
iori@wii:~$ touch hola.txt
iori@wii:~$ ls
amsn_received Descargas Escritorio hola.pl Imágenes perl prog_perl Público
bash Documentos examples.desktop hola.txt Música Plantillas prueba.sh~
Videos
iori@wii:~$
rm: remover (remove), elimina archivos.
iori@wii:~$ rm hola.txt
iori@wii:~$ ls
amsn_received Descargas Escritorio hola.pl Música Plantillas prueba Público
bash Documentos examples.desktop Imágenes perl prog_perl prueba.sh~
Videos
iori@wii:~$
mkdir: Crear directorio(make directory), crea un nuevo directorio.
iori@wii:~$ mkdir prueba
iori@wii:~$ ls
amsn_received Descargas Escritorio hola.pl Imágenes perl prog_perl
prueba.sh~ Videos
bash Documentos examples.desktop hola.txt Música Plantillas prueba Público
iori@wii:~$ cd prueba/
iori@wii:~/prueba$
rmdir: remover directorio(remove directory), elimina directorio.
iori@wii:~$ rmdir prueba/
iori@wii:~$ ls
amsn_received Descargas Escritorio hola.pl Música Plantillas prueba.sh~ Videos
bash Documentos examples.desktop Imágenes perl prog_perl Público
iori@wii:~$
mv: mover (move), mueve un un directorio o archivo al directorio especificado. Al igual
que cambia el nombre de un archivo. Por ejemplo mover el archivo llamado “hola.pl” al
directorio pl/ y cambiar el nombre de “hola.pl” por el de “william.pl”.
iori@wii:~$ mkdir pl
iori@wii:~$ mv hola.pl pl
iori@wii:~$ cd pl
iori@wii:~/pl$ ls
hola.pl
iori@wii:~/pl$ mv hola.pl william.pl
iori@wii:~/pl$ ls
william.pl
iori@wii:~/pl$
Perl.
Perl (Practical Extraction and Report Language, por sus siglas en inglés), es un lenguaje
interpretado. Considerado como un lenguaje escrito de forma ecléctica por Larry Wall. Perl
se deriva del lenguaje C de programación, así como el sed, awk y el shell de Unix, además
de otras herramientas y lenguajes.
Las facilidades para la manipulación de procesos, archivos, y texto hace que este lenguaje
este particularmente bien situado en las tareas donde involucran el rápido desarrollo de
programas, desarrollo de utilerías para el sistema operativo, herramientas de software,
tareas relacionadas con la administración de sistemas, manejo de bases de datos,
programación de gráficas, redes, y del World Wide Web. Estas fortalezas hacen que Perl sea
un lenguaje de programación muy popular para los administradores de sistemas UNIX y los
creadores de “CGI scripts”. Aunque lo anterior, no es una limitante para que cualquier
persona se involucre y use este lenguaje de programación.
Programación en Perl.
Al inicio de un programa de Perl, en Unix o Linux debe iniciar con:
#!/usr/local/bin/perl w o #!/usr/bin/perl w o donde se encuentren instalado. El w
muestra los mensajes de error al ser depurado el programa, aunque no hay problema si no lo
lleva, es importante para los principiantes en perl.
Los programas de perl, por convención, finalizan con la extensión .pl , cada línea de
comando debe finalizar con punto y coma (;) , cada línea de comentarios, sobre las líneas
de programación deben iniciar con el símbolo: # . Los bloques de código de perl, tales
como los ciclos de control y las condiciones siempre deben encerrarse entre corchetes
({..}).
En perl no es necesario la declaración de variables como en otros lenguajes tales como c++
o java, pero puede hacerse si desea.
Los datos en perl son variables escalar, arreglo de escalar, arreglos asociativos(hash), las
variables escalares se identifican por empezar con el símbolo $ (ejemplo: $variable) , los
arreglos de escalares comienzan con el símbolo @(ejemplo: @arreglo) y los arreglos
asociativos que son tablas hash empiezan con el símbolo %(ejemplo: %tabla_hash). Las
variables escalares pueden contener valores numéricos o cadena y puede adoptar cualquiera
de este tipo de dato durante la ejecución del programa, los arreglos suelen ser un conjunto
de variables escalares, pero los datos que se pueden guardar en un arreglo son: variables
escalares, números , cadena de caracteres, arreglos. Un arreglo puede contener dentro de si
otro arreglo.
Ejemplo de tipo de variables:
$variable; #variables escalar sin nigunu contenido
$var=1; #variable escalar con valor numerico
$var2=”hola”; # variable escalar con una cadena de caracteres
@arreglo; #arreglo sin ninguna variable
@arreglo2=(1,2,3,4,$var,@arreglo,”hola”);#arreglo que contiene caracteres numéricos,
variables escalares, arreglo y cadena de caracteres
La impresión en perl utiliza la función print, ejemplo:
print “hola mundo”; #impresión de una cadena de caracteres
prnt $variable; #impresión de una variable escalar
print “el resultado es $resultado”; #impresión de una cadena de caracteres y una variable
escalar
print @arreglo; #impresión de un arreglo
La forma estándar para la introducción de valores vía teclado es con la función SDTIN:
print “Cual es tu nombre”;
$nombre=<STDIN>;# la variable nombre adopta el valor introducido desde el teclado.
print “Tu nombre es $nombre”;
Tablas Hash.
Una tabla hash o simplemente hash es una colección de datos escalares con elementos
individuales seleccionados por algún índice. Una variable hash comienza con un % y sigue
la misma convención de nombres de una variable escalar. Luego tenemos 3 formas de
almacenamiento de información; un escalar $, un arreglo @, un hash %, así $alumnos es
distinto a @alumnos y %alumnos.
Para crar un elemento de un hash se requiere una lista de 2 valores, el primer elemento es la
clave y el segundo es el valor ; en las tablas hash los elementos se acceden por claves y no
hay claves duplicadas.
Se tiene una variable hash denominada %x;
$x{’clave’} = valor;
$x{123.5} = ”5.4” # la clave es el string ”123.5”
Representación literal de un hash :
@lista = %x;
@lista ====> (clave, valor, clave, valor, clave, valor,...);
%y = @lista;
%x = %y;
Ejemplo de una tabla hash:
#!/usr/bin/perl w
print "Ejemplo de una tabla hash\n";
%hash=("nombre",william,"apep",bravo,"apem",zacarias,"edad",21);
print "Impresión de la tabla hash \n $hash{nombre} \n $hash{apep} \n $hash{apem} \n
$hash{edad} \n";
print "si desea acceder a la tabla sin necesidad de mencionar cada clave esta es una buena
opción \n";
@llaves = keys(%hash);# La función keys() obtiene las claves de la tabla hash
@valores = values(%hash);# La función values() obtiene los valores de la tabla hash
$pos=0;
foreach $elemento(@llaves){
print "clave:".$llaves[$pos]." > valor: " . $valores[$pos] ."\n"; # El punto concatena
$pos++;
}
Nota: cuando se usa el valor del arreglo en un solo elemento se usa en su forma escalar ($).
Estructura selectivas.
La estructura selectiva if evalúa una condición, si esta es verdadera ejecuta una o varias
instrucciones. Existe la variante ifelse en el cual si no se cumple la condición if se
ejecutan las instrucciones dentro del else. También pueden anidarse varias sentencias if, los
cuales cumplen son varias sentencias ifelse.
Operadores de comparación de valores numéricos.
Operador Descripción
< menor que
> mayor que
== igual que
<= menor o igual que
>= mayor o igual que
!= no igual a
Operadores de comparación de cadena de caracteres.
Operador Descripción
lt menor que
gt mayor que
eq igual a
le menor o igual que
ge Mayor o igual que
ne No igual a
Ejemplos de la estructura selectiva if:
Ejemplo 1.
if ($var > 0) {
print ("El número es positivos");
}
Ejemplo 2.
if ($ var1 > $ var2) {
print ("El numero mayor es $var1 \n");
}
else {
print "El numero mayor es $var2 \n";
}
Ejemplo 3.
if ($var1 == $var2) {
print ("Los valores son iguales\n");
}
elsif ($var1 >= $var2) {
print ("El primer numero es mayor\n");
}
else {
print ("El segundo numero es mayor\n");
}
Ciclo foreach.
El ciclo foreach aplica una actividad a un arreglo, un ejemplo sería verificar si existe cierto
elemento en determinado arreglo. Por ejemplo, verificar si existe la palabra pera en el
siguiente arreglo, puede hacerse con un ciclo for igualmente, a diferencia de este el ciclo
foreach toma la cadena de caracteres en la primera posición ejecuta una instrucción,
avanza verificando posición por posición.
#!/usr/bin/perl w
@arreglo=("pera","manzana","uva","fresa","coco","pera","narana","sandia","lima","pera");
$posicion=0;
$tamano=@arreglo; # toma el valor escalar del arreglo, es decir, el número de elementos
en el.
print "El tamaño del arreglo es de $tamano\n";
foreach $elemento(@arreglo){ #para cada elemento en el arreglo @arreglo
print "Verificando posición $posicion\n";
if($elemento eq "pera")
{
print "la palabra 'pera' existe en el arreglo y esta en la posicion $posicion \n\n";
}
$posicion++;
}
Funcion split().
La función split() divide un las partes de una cadena dada dependiendo del carácter
delimitador, esta función es muy común usarlas en los cgi en en métodos get y post, en el
método get los usa para dividir la cadena dependiendo de la codificación de URL para el
paso del parámetros usando como delimitador los caracteres especiales &, + y ? .
Ejemplo de la función split(), el siguiente programa cuenta cuantas palabras se introducen
desde el teclado.
#!/usr/bin/perl w
print "Programa que cuenta el número de palabras de un texto introducido vía teclado\n";
print "introduce las palabras\n";
$linea=<STDIN>;
chop $linea;
@arreglo=split(/ /,$linea);#la funcion split divide las palabras y las guarda en el arreglo
cuando encuentra un espacio
$tama=@arreglo;
print "@arreglo\n";
print "el numero de elementos en el arreglo es de $tama\n";
Subrutinas en perl.
Las subrutinas son programas que están diseñados para ejecutar alguna tarea específica.
Estas se escriben una sola vez, pero pueden ser referenciadas en diferentes puntos de un
programa de modo que se puede evitar la duplicación innecesaria del código. Se puede
decir que una subrutina es un método, llamado así en lenguajes como java.
Ejemplo de subrutina, el siguiente programa tiene una sub rutina llamada suma se declara
con la palabra reservada “sub” seguido del nombre de la subrutina y sentencias que ejecuta
la subrutina van entre corchetes ({}). El llamado a la subrutina se hace con el caracter &
seguido del nombre de la subrutina.
#!/usr/bin/perl w
print (“ Teclea 5 numeros enteros\n”);
&suma;
print $ valor;
sub suma {
$valor=0;
for ($ contador=1; $ contador<=5; $ contador ++) {
$num=<STDIN>;
$valor=$ valor+$ num;
}
$valor;
}
El uso de variables locales en las subrutinas permite una mayor claridad de organización
dentro de los programas creados. Perl, permite declarar variables locales de la siguiente
forma:
my ($ var1, $ var2 ...)
además
local ($ var1, $ var2 ..)
Por ejemplo:
#!/usr/bin/perl w
print (“ Teclea 5 números\n”);
&suma;
print $ valor;
sub suma {
local($ valor, $ contador, $ num);
$valor=0;
for ($ contador=1; $ contador<=5; $ contador ++) {
$num=<STDIN>;
$valor=$ valor+$ num;
}
$valor;
}
Expresiones regulares en perl.
Un patrón es una secuencia de caracteres que se buscan dentro de una cadena de caracteres.
En Perl, un patrón se representa entre diagonales /cgi/ . El patrón de referencia encontrará
todas las ocurrencias que existan en una cadena de caracteres. En Perl define un operador
especial que prueba si un patrón coincide dentro de una cadena de caracteres o no. Dicho
operador operador se define por los caracteres: “=~ “ .
Ejemplo: El siguiente programa verifica si se encuentra la palabra si o la palabra no dentro
de la respuesta y ejecuta una sentencia si las encuentra.
#!/usr/bin/perl w
print (“ Es divertido aprender Perl, si o no?\n”);
$respuesta=<STDIN>;
if ($respuesta =~/si/) {
print (“Porque facilita mi trabajo de programación\n”);
} else {
print (“Aparentemente no. Pero, es muy fácil de aprender\n”);
}
Caracteres especiales en los patrones .
Perl puede manejar varios caracteres especiales dentro de los patrones, los cuales
posibilitan el número de coincidencias en una cadena de caracteres. Estos caracteres
especiales son lo que hace a los patrones útiles. El caracter El caracter especial + significa
uno o más de los caracteres precedentes. Por ejemplo, el patrón /de+f/ busca las especial +
coincidencias con cualquiera de los siguientes cadenas:
def
deef
deeef
deeeeef
El caracter especial [] te permite definir patrones que coinciden con un grupo de
alternativas. Por ejemplo el siguiente patrón encuentra las coincidencias: def o dEf. queda
de la siguiente forma:
/d[eE]f/
Los caracteres especiales * y ? .Con el carácter especial * se tiene coincidencias de cero o
más ocurrencias del carácter al que precede. /de*f/ tenemos: df, deef. Con el carácter
especial ? se tiene coincidencias de cero o un carácter del carácter que le precede, /de?f/ ,
secuencias de escape para los caracteres especiales . Si quieres que el patrón incluya un
carácter que normalmente es tratado como caracter especial, coloca el caracter con una
diagonal invertida \.
Ejemplo:
#!/usr/bin/perl w
print "Ecpresion regular con caracteres especiales\n";
$contador=0;
$linea=<STDIN>;
while ($linea ne "") {
chop ($linea);
@palabra=split(/[\t ]+/, $linea);
$contador+=@palabra;
print $contador;
$linea=<STDIN>;
}
print ("Numero total de palabras: $contador \n");
El operador de sustitución .
Perl permite sustituir una parte de una cadena usando el operador de substitución, su
funcionamiento es buscar y reemplazar. El cual tiene la siguiente sintaxis:
s/patrón/sustituto/ . Ejemplo:
#!/usr/bin/perl w
print "El programa sustituye la palabra hola por: que hay\n";
print "escribe hola mundo\n";
$linea=<STDIN>;
chop ($linea);
$linea =~ s/hola/que hay/;
print "$linea\n";
Transliteración de carácter global.
tr / / / es un operador conveniente y eficiente que cambia un conjunto de caracteres dentro
de otro. El primer argumento es la lista de caracteres a buscar. El segundo argumento es la
lista de caracteres sustituta. Construye un mapeo de traducción de carácter en tiempo de
compilación. En tiempo de ejecución, cambia cualquier carácter que pueda ser encontrado
en la cadena dentro del carácter correspondiente en la lista sustituta. Por ejemplo, tr /az/A
Z/. Es solo una forma alternativa de convertir letras o caracteres a mayúsculas sin el uso de
la función uc().
DESARROLLO INSTALACIÓN, CONFIGURACIÓN Y PRUEBAS.
El sistema Operativo a usar para efectos de esta practica es la distribución GNU/Linux
Ubuntu 9.10 Karmic Koala publicada en Octubre de 2009 y tiene soporte hasta Abril de
2011. En Ubuntu el directorio donde se guarda los formularios es /var/www y directorio
CGI se encuentra es /usr/lib/cgibin/ en este directorio es donde se guarda los cgi, para
poder visualizar el el cgi debe tener los permisos de ejecución necesarios, también se
utiliza un browser o navegador web, en este caso se usa Mozilla Firefox versión 3.5.3,
Servidor web.
El servidor web a usar es Apache 2. Para su instalación se abre una terminal que se
encuentra en el menú Aplicaciones > Accesorios > Terminal y se ejecutas el comando
“sudo su” para poder instalar Apache 2. Depués ejecutas el comando de instalación de
Apache 2 “aptget install apache2”.
Soporte del servidor web configuración.
Antes de proceder con la programación de CGI, asegurate de que el servidor web que se
esta utilizando soporta CGI y este configurado para el manejo de CGI. Todos los programas
de CGI son ejecutados por el servidor HTTP se mantienen en un directorio o carpeta pre
configurado. Dicho directorio es llamado directorio CGI y por acuerdo es nombrado
como /cgibin. Por acuerdo los CGI programados en Perl tienen la extención .cgi.
Perl.
Para saber si Perl esta instalado en tu sistema(tipo Unix) ejecuta el comando “which perl”
en el prompt y si se encuentra instalado muestra la ruta donde se encuentra. Ejemplo:
iori@wii:~$ which perl
/usr/bin/perl
iori@wii:~$ perl v
This is perl, v5.10.0 built for i486linuxgnuthreadmulti
Copyright 19872007, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
Programación de CGI.
Como se menciona anteriormente un formulario en HTML es procesado por un programa
CGI. Escribe el siguiente código, debes de tener en cuenta que debes de estar logeado
como superusuario para poder escribir el formulario y el cgi. Con el comando “sudo su” el
simbolo # indica que estas logeado como superusuario.
Para escribir el código utiliza un editor de texto como gedit, nano, pico, vi, etc.
gedit: editor de texto para escritorio GNOME
nano: editor Nano's ANOther, un clone aumentado de free Pico
vi: un editor de texto para programadores.
Entra al al directorio /var/www, crea un archivo llamado form1.html , teclea el código del
formulario y guarda.
Código del formulario.
<html>
<head>
<title>Formulario procesado por cgi programado en perl</title>
</head>
<body>
<FORM action="http://localhost/cgibin/enviroment.cgi" method="GET">
Nombre(s): <input type="text" name="nombre"> <br>
Apellidos: <input type="text" name="apellidos">
<input type="submit" value="Enviar">
</FORM>
</body>
</html>
Debe darse cuenta que el método de petición que se esta utilizando es GET y que el
atributo ACTION llama a un cgi llamado enviroment.cgi y el navegador web lo busca en la
dirección http://localhost/cgibin/enviroment.cgi cuando se presione en boton Enviar, el
cual se encuentra en el directorio CGI.
La primera linea es la linea que todo programa en Perl lleva, la linea que lleva la cabecera
Contenttype: text/html\n\n es para que pueda usarse el código html y las \n hacen una
linea en blanco en el programa, el cual es importante.
Ejecución CGI.
Primero que nada para que el CGI pueda ser ejecutado en el navegador web necesita tener
permisos de ejecución. Por lo tanto se le dan permiso de ejecución al archivo
enviroment.cgi con el comando chmod.
Ahora abra el navegador web, teclee la ruta http://localhost/form1.html , llene el formulario
y presione el botón Enviar.
Recuerde que el formulario es procesado por el CGI enviroment.cgi con el método de
solicitud GET. En el cual se codifica en el URL los parámetros enviados, en este caso
nombre y apellidos, como puede observar en la imagen estos son guardados en la variable
ambiente QUERY_STRING y que la variable ambiente REQUEST_METHOD tiene el
valor de GET.
Ahora modifique el formulario form1.html cambiando el “GET “ en el atributo METHOD
de la etiqueta FORM por el método “POST” y guarde los cambios.
Ahora actualice el form1.html en el navegador web (http://localhost/form1.html ), pues el
navegador guarda en el cache el formulario llenado anteriormente. Después de eso, llene el
formulario nuevamente y presione el botón Enviar.
Observe que el método usado actulmente es el POST, y la variable ambiente
QUERY_STRING se muestra vacía, pero CONTENT_TYPE y CONTENT_LENGTH
están llenas. CONTENT_TYPE contiene el tipo MIME de los datos del formulario que
pasa al programa CGI y CONTENT_LENGTH contiene el número de bytes de ese flujo de
datos.
Lo anterior fue una practica para demostrar como trabaja un formulario procesado por un
cgi y al mismo tiempo para demostrar el comportamiento de las variables de ambiente en el
método GET y el método POST.
Ahora observa como funciona un formulario cuando cuando el CGI regresa con los
parámetros enviados por el formulario. Para esto crea un nuevo formulario en la ruta
/var/www/ con el nombre
los_tux_practicapw.html, teclee el código del formulario los tux y guarde..
Código del formulario los Tux.
<html>
<head> <title>PROGRAMACION WEB</title></head>
<style type="text/css">
p {fontfamily:tahoma; color:blue}
body {backgroundcolor:wheat}
</style>
</head>
<body>
<center><p>BIENVENIDO A NUESTRA PAGINA</p></center>
<h5>Somos el equipo los tuxs de la carrera Ing. en Sistemas Computacionales
nuestros son: William, Mario y Laura y quisieramos saber un poco de ti</h5>
<br><br><br>
<FORM action="http://localhost/cgibin/cgi_tux.cgi" method="POST"
target="_blank" >
<p>Nombre:</p> <input type="text" name="tu_nombre" > <br>
<p>Sexo:</p>
Masculino<input type="radio" name="sexo" value="masculino">
Femenino<input type="radio" name="sexo"
value="femenino"><br><br>
<p>Escoge la(s) carrera(s) que mas te llame la atencion:</p> <br><br>
<p> Indica la colonia en la que vives:</p><br>
<select name="colonia">
<option value="11 de septiembre" selected>11 de septiembre</option>
<option value="libertad el carmen" >libertad el carmen</option>
<option value="buenos aires" >buenos aires</option>
<option value="indeco" >indeco</option>
<option value="pintoresco" >pintoresco</option>
<option value="carmen y maravillas" >carmen y maravillas</option>
<option value="san jose el eden" >san jose el eden</option>
<option value="antiguo aeropuerto" >antiguo aeropuerto</option>
<option value="centro" >centro</option>
<option value="18 de octubre" >18 de octubre</option>
<option value="otras" >otras</option>
</select><br>
<p>Describe ¿cuales son tus defectos y virtudes?, Describete:</p><br>
<textarea name="descripcion" cols=40 rows=5 >
Escribe aqui...
</textarea>
<p>¿Cual es tu hobbie?</p><br>
<select name="diversion" size=4 multiple>
<option value="chat" selected>chat</option>
<option value="cine" >cine</option>
<option value="pintura" >pintura</option>
<option value="escuchar musica" >escuchar musica</option>
<option value="dibujar" >dibujar</option>
<option value="manualidades" >manualidades</option>
<option value="viajar" >viajar</option>
<option value="patina" >patinar</option>
<option value="cocinar" >cocinar</option>
<option value="ver television" >ver television</option>
<option value="otras" >otras</option>
</select><br><br>
<center>
<input type="submit" name="en" value="Enviar">
<input type="reset" name="bo" value="Borrar">
</center>
</FORM>
</body>
<html>
Crea un nuevo CGI para este formulario en la ruta /usr/lib/cgibin con el nombre
cgi_tux.cgi , teclee el código de CGI Los Tux, asegurece de darle los permisos de
ejecución al archivo CGI después de crearlo.
Código CGI Los Tux.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM); #declaración de variable locales
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/az/AZ/; #conversión a mayúsculas
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); # si la variable ambiente
contiene algún #valor, esta es procesado como POST , sino el procesado como
GET
}else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer); #divide la variable $buffer con el delimitador & y lo guarda
en el #arreglo @pairs
foreach $pair (@pairs) # analiza cada elemento del arreglo @pairs
{
($name, $value) = split(/=/, $pair); #doble asignación una en la variable $name otra
en la #variable $value usando la función split() para dividir cuando encuentra el signo =
(igual).
$value =~ tr/+/ /; #cambia el signo + (mas) por “ ”(un espacio)
$value =~ s/%(..)/pack("C", hex($1))/eg; #sustituye caracteres hexadecimales por
los reales
$FORM{$name} = $value; #guarda en el hash %FORM con clave que contiene
$name
}
#apartir de esta linea se usa la tabla hash %FORM y se le asigna valores a variables
escalares.
$tu_nombre = $FORM{tu_nombre};
$sexo = $FORM{sexo};
if( $FORM{isc} ){
$isc_flag ="Si";
}else{
$isc_flag ="No";
}
if( $FORM{ic} ){
$ic_flag ="Si";
}else{
$ic_flag ="No";
}
if( $FORM{iq} ){
$iq_flag ="Si";
}else{
$iq_flag ="No";
}
if( $FORM{ie} ){
$ie_flag ="Si";
}else{
$ie_flag ="No";
}
if( $FORM{ii} ){
$ii_flag ="Si";
}else{
$ii_flag ="No";
}
if( $FORM{ic} ){
$li_flag ="Si";
}else{
$li_flag ="No";
}
$colonia = $FORM{colonia};
$text_content = $FORM{descripcion};
$hobbie = $FORM{diversion};
print "Contenttype:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Formulario de los Tux</title>";
print "</head>";
print "<body>";
print "<h2> Tus datos son:</h2><br><br>";
print "<h6> Nombre: $tu_nombre </h6>";
print "<h6> Sexo: $sexo</h6>";
print "<h6>La(s) carrera(s) que te gusta(n) es(son):</h6>";
print "<h6>ingenieria en sistemas: $isc_flag </h6>";
print "<h6>ingenieria civil: $ic_flag </h6>";
print "<h6>ingenieria quimica: $iq_flag </h6>";
print "<h6>ingenieria electromecanica:$ie_flag </h6>";
print "<h6>ingenieria industrial:$ii_flag </h6>";
print "<h6>Licenciatura en informatica:$li_flag </h6><br>";
print "<h6>Vives en la colonia: $colonia </h6><br>";
print "<h6>Defectos y virtudes: $text_content </h6><br>";
print "<h6>TU hobbie es: $hobbie </h6><br><br><br>";
print "<h6>Buen dia $tu_nombre </h6><br><br>";
print "</body>";
print "</html>"; #Termina código
Nota: La impresión en HTML, para devolver al navegador web usando las variables
escalares, se encierra entre comillas dobles para no traducir los caracteres especiales que
utiliza HTML por el interprete de Perl.
Ahora que están creado tanto el formulario como el CGI, abra el navegador web y teclee la
ruta http://localhost/los_tux_practicapw.html , llene el formulario y presione el botón
Enviar
El CGI procesa la información enviada a través del formulario y lo regresa a través de
código HTML al cliente, sin antes decodificar los parametros enviados dependiendo del
método utilizado(GET o POST).Debe aparecer algo parecido al enviar su formulario con
sus datos.
REDACCIÓN DE APRENDIZAJES ADICIONALES ADQUIRIDOS.
Los aprendizajes adicionales adquiridos es el aprendizaje de un nuevo lenguaje de
programación llamado perl, algunas etiquetas HTML, comandos unix, y el comportamiento
de las variables ambiente.
CONCLUSIÓN.
Los CGI son programas que facilitan el procesamiento del lado del servidor web, pues
facilita la recabación de entrada del servidor, regresa los datos solicitados por el cliente.
Ahora ya sabe que debe tener programas en el servidor listos para correr y entiende como
obtener los datos del servidor y del cliente.
BIBLIOGRAFÍA E HIPERVÍNCULOS.
El libro de CGI
William E. Weinman
Prentice Hall
Perl 5 Tutorial
Primera Edición
Autor: Chan Bernard Ki Hong
Sitio web: http://www.cbkihong.com
Fecha de impresión: 24 de Diciembre de 2003.
La programación de Perl para Unix
Autor: Monico Briseño (Universidad de Guadalajara)
Fecha de impresión: Octubre de 1997
http://www.cultura.udg.mx/tutoriales/perl/perl.html
Tutorial Perl y CGI.
http://www.tutorialspoint.com/perl/perl_cgi.htm