Sei sulla pagina 1di 39

Instituto Tecnológico de Tapachula

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.

El   objetivo   de   la   practica   es   aprender   el   funcionamiento   de   un   CGI   trabajando   en   un 


servidor web,  procesando un formulario mediante un CGI programado en el lenguaje de 
programación Perl.

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   auto­referenciales. 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.

Las   variables   mencionadas   anteriormente   son   algunas,   pues   ocasionalmente   habrá 


disponible otras variables de ambiente para los programas CGI, al igual que el sistema 
puede proporcionar algunas otras variables a los programas.

Cabeceras HTTP.
Las cabeceras HTTP mas  importante, pues son usados con frecuencia en la programación 
de CGIs, son:

Cabecera Descripción
Content­type: 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.
Last­modified: String La fecha de la ultima modificación de el recurso.
Content­length: 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=”password”]   NAME={nombre}   [SIZE={tamaño}]   [VALUE={por 


default}]
  [MAXLENGTH={tamaño máximo}]>
<INPUT [TYPE=”checkbox”] NAME={nombre}  [VALUE={valor}]  [CHECKED]>

<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}] >

<INPUT   [TYPE=”image”]   NAME={nombre}   SRC={url   de   imagen} 


[ALIGN={alineación}]>

<SELECT NAME={nombre} [SIZE={tamaño}] [MULTIPLE] >
   <OPTION [SELECTED] [VALUE={valor}] >{texto}
  [ <OPTION [SELECTED] [VALUE={valor}] >{texto}    ... ]
</SELECT>

<TEXTAREA   NAME={nombre}   ROWS={numero   de   filas}   COLS={numero   de 


columnas}>
texto por default aparece aqui.
</TEXTAREA>

</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 2010­03­19 00:44 amsn_received 
drwxr­xr­x 2 iori iori 4096 2010­04­06 23:57 bash 
drwxr­xr­x 4 iori iori 4096 2010­03­24 11:12 Descargas 
drwxr­xr­x 3 iori iori 4096 2010­04­09 12:20 Documentos 
drwxr­xr­x 9 iori iori 4096 2010­04­08 13:49 Escritorio 
­rw­r­­r­­ 1 iori iori  167 2010­03­18 22:54 examples.desktop 
­rw­r­­r­­ 1 iori iori   39 2010­03­22 10:20 hola.pl 
drwxr­xr­x 3 iori iori 4096 2010­04­03 19:05 Imágenes 
drwxr­xr­x 2 iori iori 4096 2010­04­03 17:55 Música 
drwx­­­­­­ 4 iori iori 4096 2010­04­07 23:31 perl 
drwxr­xr­x 2 iori iori 4096 2010­03­18 23:12 Plantillas 
drwxr­xr­x 2 iori iori 4096 2010­04­07 22:00 prog_perl 
­rw­r­­r­­ 1 iori iori    0 2010­04­06 23:28 prueba.sh~ 
drwxr­xr­x 2 iori iori 4096 2010­03­18 23:12 Público 
drwxr­xr­x 2 iori iori 4096 2010­03­18 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.

chmod.  Este   comando   cambia   los   permisos   de   determiando   archivo   o   directorio.Cada 


MODO   es   de   la   forma   `[ugoa]*([­+=]([rwxXst]*|[ugo]))+'.   Por   ejemplo:   Si   se   quiere 
cambiar el los permisos de ejecución del archivo llamado prueba.sh en el directorio home/ 
para que todos los usuarios puedan ejecutarlo.  
iori@wii:~$ ls ­l prueba.sh~ 
­rw­r­­r­­ 1 iori iori 0 2010­04­06 23:28 prueba.sh~ 
iori@wii:~$ chmod a+x prueba.sh~ 
iori@wii:~$ ls ­l prueba.sh~ 
­rwxr­xr­x 1 iori iori 0 2010­04­06 23:28 prueba.sh~ 
iori@wii:~$ 

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  if­else  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 if­else.

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 /a­z/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/cgi­bin/   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  “apt­get install apache2”.

Al terminar la instalación abres el navegador web y tecleas la ruta  http://localhost/   en el 


cual aparece el texto que dice “it works”, entonces apache esta funcionando correctamente.

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 /cgi­bin. 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

Si   muestra   un   resultado   parecido,   también   puedes   saber   la   versión   de   Perl   instalada 


ejecutando el comando  “perl ­v” , el cual muestra la versión de perl. Debe aparecer algo 
como esto:

iori@wii:~$ perl ­v 
This is perl, v5.10.0 built for i486­linux­gnu­thread­multi 
Copyright 1987­2007, 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/cgi­bin/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/cgi­bin/enviroment.cgi  cuando se presione en boton Enviar, el 
cual se encuentra en el directorio CGI.

Ahora   cambia   el   directorio   a   la   ruta     /usr/lib/cgi­bin/   y   crea   un   archivo   CGI   llamado 


enviroment.cgi, teclea el código del cgi.
Código del CGI.
#!/usr/bin/perl 
print "Content­type: text/html\n\n"; 
print "<font size=+1>Environment</font>\n"; 
foreach (sort keys %ENV) 

  print "<b>$_</b>: $ENV{$_}<br>\n"; 
}

La primera linea es la linea que todo programa en Perl lleva, la linea que lleva la cabecera 
Content­type: 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  {font­family:tahoma; color:blue} 
 body {background­color: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/cgi­bin/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> 

      Ing.  en   sistemas   computacioneles   <input   type="checkbox"   name="isc" 


value="on"><br> 
   Ing. civil <input type="checkbox" name="ic" value="on"><br> 
   Ing. quimica <input type="checkbox" name="iq" value="on"><br> 
      Ing.   en   electromecanica<input   type="checkbox"   name="ie" 
value="on"><br> 
   Ing. industrial <input type="checkbox" name="ii" value="on"><br> 
      Lic.   en   informatica   <input   type="checkbox"   name="li" 
value="on"><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/cgi­bin   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/a­z/A­Z/; #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 "Content­type: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

Potrebbero piacerti anche