Tabla de Contenidos de la Sección 3.2

3.2- Programación de CGI, en Perl

3.2.1- cgi-lib.pl

3.2.2- CGI Lite


3.2- Programación de CGI, en Perl

Aunque la programación de GCI's para WWW no es ni mucho menos un tema básico, menciono el uso de la libreria para implementarlos por ser este uno de sus usos mas comunes y poderosos.
Recomiendo ampliamente que se adquiera algo de experiencia desarrollando programas comunes de Perl antes de abordar este tema, pues a diferencia del resto del documento, se requiere tomar en cuenta muchos factores que no podemos tratar aqui para implementar CGI's.

Para quien tome este tutorial como su primera aproximacion a los CGI's describire a grandes razgos los actores del funcionamiento de los CGI's clasicos.

CGI se suele interpretar como Common Gateway Interfase, es decir: Interfase comun hacia los recursos del sistema.

La funciónoriginal de los CGI's es ser un progrma de enlace entre un servidor de algun tipo (WWW, Gopher, o algun otro) y algun programa o funcióndel SO que el servidor no estaba diseñnado a usar en su construcción original (lo cual abarca a casi todos).

Los CGI's se desenbuelven en el ámbito de los clientes y servidores, especialmente aquellos como WWW y Gopher, cuya funciónprimordial es el entregar información en un formato específico, y no la interoperabilidad con diversos programas.
El proceso de los CGI's se lleva a cabo en el lado del servidor, es decir, el cliente, elabora una peticiónal servidor, y la envia, para despues recivir del servidor los resultados a su petición como cualquer otra información usualmente enviada por este. La diferencia de los CGI's con los datos usualmente enviados por el servidor, es que los datos generados por CGI's son calculados en el momento por una serie de programas (entre los que esta el CGI) mientras que los datos comunes suelen ser archivos puestos a disposición del servidor.
Conviene recalcar que el proceso que implica el CGI se lleva completamente del lado del servidor.

De modo que el CGI recive una petición del servidor, en el formato y con el contenido que el servidor desee, y a partir de esta, elabora una petición para el programa nativo, esta petición, debera estar en la forma y con el contenido que el programa nativo desea. Posteriormente, el CGI captura la salida que el programa nativo genera, y la procesa para que cumpla con las expectativas del servidor.

Sin embargo, el CGI puede decidir por si mismo los procesos que lleve a cabo, como cualquier otro proceso del SO, por lo que no es requisito que invoque otros programas, y puede, en base a los datos recibidos, generar una respuesta por si mismo.

Pasemos ver ahora la forma de programar CGI's para WWW en Perl.

De inicio, supondremos una máquina donde está disponible un servidor de WWW, y que tiene algún directorio (en el que pondremos nuestros scripts) definido como fuente para los CGI, por lo regular exste un directorio cbi-bin, pero también pueden establecerse directorios que además de este sirvan como fuente de CGI's.
Además, supondré que el lector tiene una fuente alterna de información sobre el diseño y elaboración de las formas y de html, de modo que tampoco trataré esos temas en el presente, sino que me dedicaré, exclusivamente a la forma de realizar CGI's básicos.

Las formas no son sino aquellas paginas HTML que tienen campos para capturar informacion y la capacidad de incvocar en el servidor la ejecucion de un CGI, recomiendo los siguientes url para obtener mas informacion:
http://www.bio.cam.ac.uk/web/form.html
http://www.seas.upenn.edu/~mengwong/forms/

Debo agradecer a Steven E. Brenner por haber hecho y distribuido gratuitamente las rutinas que estaremos usando y que se pueden conseguir por medio de la red y que en algunas distribuciones (como la de Irix) ya vienen incluidas.

En este tutorial hablaremos de la version de cgi-lib para Perl4 y su contraparte para Perl5 de modo muy básico, ya que la elaboración de aplicaciones mas complejas hacen forzosa la revisión de la documentación de las respectivas librerías, en todo caso recomiendo ampliamente revisar a consiencia la FAQ de CGI's con Perl en:
http://www.perl.com/perl/faq/perl-cgi-faq.html

La mayoría de las librerias para Perl vienen bien documentadas y son fáciles de usar, esta sección pretende ser mas una introducción a los diversos mecanismos y una reflexión sobre su funcionalidad, que una herramienta de aprendizaje, pues este solo se logrará revisando los mismos modulos y su documentacion, ademas de practicar en su uso.

3.2.1- cgi-lib.pl

Si alguna librería de funciones para perl merece el calificativo de celebre, es esta, por su simplicidad y amplio uso. Nos permite simplificar la elaboracion de CGI's en perl 4, y las funciones mas comunmente usadas de ella son:

ReadParse Esta es la mas usada (y util) de todas, al invocarse lee los datos enviados a nuestro CGI de la forma (ya sea por el metodo POST o GET) y los convierte en texto sin los códigos de escape con que se envian. Poniendo los pares de nombre de parametro y su valor en un arreglo asociativo llamado %in.

PrintHeader Esta función regresa la cedena con la que debe iniciar la respuesta enviada al servidor para que se interprete como html, regularmente usada en un "print &PrintHeader;".

Un CGI sencillo con estas rutinas resulta ser:


#!/usr/bin/perl
require "cgi-lib.pl";
print &PrintHeader;

if (&ReadParse)
{
  foreach $llave (keys(%in))
  {
    print "variable:$llave\tvalor:$in{$llave}\n";
  }
}
else
{
  print "Lo siento, no recivi parametros";
}
Este se limita a imprimir todos los nombres de las variables, seguidos por los valores que desde una forma se les asignaron. Como se puede ver, es muy sencillo, pues basta con invocar &ReadParse para que se interpreten los datos recividos y si se desea utilizar la cadena de &PrintHeader para iniciar nuestra respuesta. El resto de la funcionalidad de un CGI ya es algo particular a los programas que invoque, y la ejecución de comandos y el formateo de resutlados son de los puntos fuertes de Perl, por lo que no recivirá mayor discusión aqui.

Eso es todo lo que veremos de la libreria cgi-lib.pl, pues en realiad una revision de la misma libreria es todo lo que se necesita para estar al tanto de como se usa y las funciones que contiene, es apenas de 201 lineas, por lo que ni siquiera es una tarea laboriosa la revision que propongo.

3.2.2- CGI Lite

Es la version sencilla de los módulos contenidos en CGI.pm, estos ya son para Perl5, y como la mayoría de los módulos para este están orientados a objetos, esto no debe asustarnos, pues el modo de usarlos incluso se parece al modo de usar aquellos de cgi-lib.pl, quedando oculta la funcionalidad del modulo tras funciones sencillas de usar.
En este documento no revisamos la programación orientada a objetos en Perl debido a que maneja los conceptos de POO de modo en extremo particular, por lo que haría falta toda una revision de la teoria de la POO.

Recomiendo al menos leer la documentacion del modulo incluida como POD en el mismo modulo, poque en la siguiente discución daré por hechas una serie de suposiciones que podrían no ser verdaderas en todas las plataformas.

A continuacion revisemos el uso básico de este modulo:

Hay que mencionar, que la funcionalidad que tengamos con este modulo, la usarmeos a travez de una variable que "contendra" el objeto, de modo que si no se esta familiarizado con la POO, puede pensarse que las funciones y estructuras se invocan tal cual, en un orden arbitrario en ocaciones y con una sintaxis extraña, pero que no por eso dejan de ser funciones y estructuras de datos.

Como todo modulo de Perl5, se incluye con use, en este caso con la instruccion use CGI_Lite;

Para crear el objeto con la funcionalidad de nuestro CGI, es decir, para inicializarlo, necesitamos una variable que nos de acceso a la funcionalidad de la clase CGI_Lite, es decir, un objeto. Para esta discucion (al igual que en la documentacion del propio CGI_Lite) usaremos $form para estos fines.

$form = new CGI_Lite();
Crea un nuevo objeto tipo forma, que sera nuestra puerta para usar CGI_Lite.

La segunda funciónque esperamos es el capturar los parametros pasados por el servidor en un hash, si usamos el hash %par para este fin tendremos:

%par=$form->parse_form_data();Que coloca el hash de parametros en
 el hash %par.
Como se podra ver, el uso de este modulo puede ser analogo al de cgi-lib.pl, pero CGI_Lite es en realidad mucho mas poderoso que lo que acavo de mencionar, pero discutir sus posibles usos es materia de otro tutorial, baste decir que este modulo tienen la capacidad de recivir campos archivo, es decir, de recivir archivos enviados por formas HTML.

Hagamos un programa analogo al de la seccion 3.2.1, pero en Perl5 con CGI_Lite:


#!/usr/bin/perl5.003
use CGI_Lite;
$forma=new CGI_LIite ();
print "Content-type: text/html\n\n";
if( %parametros=$forma->parse_form_data() )
{
  foreach $llave (keys(%forma))
  {
    print "variable:$llave\tvalor:$forma{$llave}\n";
  }
}
else
{
  print "Lo siento, no recivi parametros";
}
Este programa, como puede apreciarse, tiene solo una mínima cantidad de cambios respecto a su version en Perl4, nótese que CGI_Lite no tiene un metodo para obtener la cadena con la que debemos iniciar el resultado, por lo que la cuarta linea del programa la pone explicitamente.

Además se nota el uso de los operadores new y -> propios de la programación orientada a objetos de Perl, si se usa este código como base para programas diferentes no es necesario comprender la mecanica de la POO, baste saber que new inicializa la clase y establece (mediante el =) a $forma como el acceso a la funcionalidad de CGI_Lite y que el operador -> permite presisamente emplear las funciones o metodos que estan en la clase.

Espero que la impresión final que los CGI's produzcan sea la de extrema simplicidad, pues con los modulos que emplee en este capitulo son en realidad simples. Aunque suelen presentarse algunas dificultades al momento de desarrollarlos en especial por conflictos de permisos de acecso y ejecucuión entre el servidor de HTTP y el usuario que escribió los programas.