|
Fue creado en octubre de 1987 por Larry Wall. Su propio autor señala que combina algunas de las mejores capacidades de C, sed, awk y sh, por lo que programadores familiarizados con estos lenguajes tendrán gran facilidad para trabajar con él sobretodo en administración de sistemas.
Perl tiene hoy en día una gama muy amplia de usos, en una gran variedad de arquitecturas, bajo varios sistemas operativos. Es con seguridad uno de los lenguajes más utilizados para tareas pequeñas y de tamaño mediano, dada la rapidez de aprendizaje y obicuidad que ostenta, si bien su capacidad para modularización lo hace también un candidato factible para tareas de mayor envergadora.
- 1987 Octubre Perl 1.0 es posteado en el grupo comp.sources de Usenet.
- 1988 Junio Es creada la versión 2.0 del lenguaje.
- 1989 Octubre Perl 3.0 es lanzado bajo licencia GNU.
- 1991 Enero "Programming Perl" (el libro del camello rosado) de Larry Wall y Randal L.Schwartz es publicado.
- Marzo Perl 4.0 es creado bajo licencias GPL y Perl Artistic.
- 1992 Enero La primera versión de Perl para Macintosh, Mac Perl 4.0.2, es realizada por Matthias Neeracher.
- Diciembre MacPerl 4.0.5 es lanzado bajo soporte DBM.
- 1993 Octubre La versión final de Perl4, Perl 4.036, es creada.
- Noviembre "Learning Perl"( el libro de la llama rosada) de Randal Schwartz es publicado.
- 1994 Octubre Tim Bunce crea DBI, una Interface absracta de Perl para Bases de Datos, y un driver DBI para Oracle.
- Octubre Nace Perl 5.000
- 1995 Marzo Perl 5.001 es creado.
- Agosto Tom Christiansen anuncia la creación del sitio web de Perl en http:mox.perl.com (ahora http://www.perl.com)
- Agosto Andreas Konig inicia la construccion del Modulo repositorio de Perl, mas tarde llamado el "Comprehensive Perl Archive Network" (CPAN).
- Septiembre Tim Bunce presenta a CPAN como el principal modulo repositorio de Perl.
- Octubre Jarkko Hietaniemi introduce CPAN a la comunidad Perl.
- 1996 Septiembre "Programming Perl", segunda edición (El libro del camello azul) por Larry Wall, Randal Schwartz y Tom Christiansen es publicado.
- Noviembre Se anuncia la creación de "The Perl Institute" (TPI).
- El "Perl Journal" publica su primer artículo: Larry Wall joins the staff of O'Reilly & Associates as a Senior Software Developer
- 1998 Agosto O´Reilly & Associates organizan la segunda Conferencia de Perl en San José, California.
- Octubre Lary Wall obtiene el premio "Free Software Foundation Award for the Advancement of Free Software"
- 1999 Enero La ActiveState Tool Corp. anuncia un soporte corporativo para Perl llamado PerlDirect.
- Marzo El TPI se disuelve.
- Junio June Kevin Lenzo (Pittsburgh Perl Mongers) organiza la "Yet Another Perl Conference" en la Universidad de Carnegie Mellon.
- Junio El "Perl Journal" es adquirido por Earth Web.
- 2000 Marzo Perl 5.6 es lanzado.
Perl es un lenguaje de propósito general y como tal está orientado básicamente al manejo de strings y archivos de texto. Es utilizado por muchos administradores de sistemas para tareas cotidianas y repetitivas. Por otro lado, Perl también soporta conexiones a C (via XS) lo cual facilita llamadas a sistema, lo cual combinado con el soporte a oientación a objetos permite la realización de programas de alta complejidad con mantenibilidad de rangos aceptable.
Perl y sh
Para tareas muy pequeñas el intérprete de Perl puede resultar muy costoso de cargar, razón por la cual sh sigue siendo utilizado para la resolución de esta clase de problemas. Sin embargo, a medida que la complejidad de las tareas crece, sh hacer notar sus limitancias como lenguaje de programación, sobretodo ante múltimples invocaciones de awk, sed, grep y similares, funcionalidades incorporadas dentro de Perl.
Perl y C
Perl suele ser mucho más ineficiente que C, sobretodo debido al tamaño del intérprete que el sistema operativo debe cargar en memoria antes de poder siquiera comenzar el programa. Sin embargo la flexibilidad del lenguaje, su multitud de bibliotecas existentes, el soporte a orientación a objetos y el manejo automático de memoria (emplazamiento y desplazamiento) lo hacen mucho mas seguro y robusto.
Perl y Phyton
Phyton, otro lenguaje interpretado, es una competencia bastante popular de perl. Su sintaxis es más elegante y el lenguaje mismo es más ortogonal. Sin embargo, no es tan obicuo, la orientación a objetos es parte fundamental de él y no es tan sencillo de aprender para programadores novatos. Como lenguaje de programación es n este momento la competencia más fuerte de Perl.
Tipos de Datos
Perl tiene básicamente cuatro tipos de datos: escalares, arreglos (o listas), hashes y referencias. Escalares son aquellas variables que tienen un único valor definido. Pueden ser números (enteros o de punto flotante), strings o referencias. Se denotan con un nombre de variable precedido de un signo $.
Los arreglos o listas son conjuntos ordenados de escalares, indicados por un número (usualmente se cuenta desde cero ascendentemente). Arreglos completos se denotan con un nombre de variable precedido de un signo @; un valor específico de un arreglo, en cambio, se denota con un signo $ y un indice entre corchetes: {$}var[1].
Los hashes o arreglos asociativos son conjuntos no ordenados de escalares, indicados por una llave.
Las referencias son en realidad un tipo ``mágico'' de escalares. Contienen un índice a un area de memoria donde hay un dato almacenado, junto con un indicador del tipo de dato al que apuntan. Dado que son escalares, es posible construir arreglos o hashes de referencias; esto hace posible instanciar casi cualquier estructura de datos. Las referencias son especiales, además, porque son fuertemente tipadas: mientras que los escalares corrientes son números o strings dependiendo del contexto de evaluación, no es posible usar una referencia de otra manera que como fue definida (es decir, una referencia a un arreglo nunca puede ser una referencia a un escalar, etc.). Es posible leer una referencia en contexto de string, y esto entrega su valor (algo como "HASH(0x804b620)'' es la representación en string de una referencia a un hash).
Estructuras de Control
Perl soporta las estructuras clásicas : if, for, while, do. Agrega tambipen otras menos corrientes : unless, foreach, until y el condicional ternario ?:. Estas estructuras pueden combinarse con etiquetas, obteniéndose resultados bastante interesantes. Veamos el siguiente :
OUTER: for my $wid (@argy1)
{
INNER : for my $jet (@ary2)
{
next OUTER if $wid > $jet;
wid += $jet;
}
}
Aquí vemos otra característica de Perl, la palabra clave "my'' que se usa para indicar el entorno léxico de una variable. En el caso del for del ejemplo, se indica que la variable $jet solo esta definida en el bloque INNER, y si tratara de leerse en el bloque OUTER (fuera de INNER) se encontraría indefinida.
Vemos también que next (Así como redo y last) pueden recibir una etiqueta de salto (Más bien, de bloque). Esto hace innecesaria la instrucción goto que plaga algunos programas en C debido a la inexistencia de estas etiquetas.
Encapsulación
Perl provee manejo de objetos apropiado. Cada clase es un paquete que provee métodos para trabajar con los objetos que se definen; el paquete decide qué interfaces exporta para sus objetos. Esto provee un nivel de encapsulación apropiado.
Bajo el capó, un objeto en Perl es simplemente una referencia bendita (bless es una función que le indica a la referencia que pertenece a una clase.). A esa referencia pueden aplicársele los métodos que la clase define. Existen métodos especiales que devuelven un objeto; por ejemplo, un constructor. Perl soporta herencia múltiple.
Además de clases existen módulos. Los módulos son una forma procedural de encapsulación en Perl. Proveen espacios de nombres de variables separados del espacio principal; esto permite tener funciones separadas del cuerpo principal e importarlas según sea necesario. Las clases son, simplemente, una variante especial de módulos. Sistema de Tipos
Perl no es un lenguaje que controle la correctitud y unicidad de los tipos. Las variables en Perl cambian de tipo según el contexto (strings o números). Además, dependiendo del contexto los tipos múltiples (arreglos y hashes) pueden tener comportamientos especiales, como retornar la cantidad de elementos. Esto permite una extraordinaria flexibilidad, pero puede ocasionar serios problemas si no se tiene cuidado en el correcto manejo de las vriables y los resultados que arroja.
Veamos un ejemplo :
$a = 123;
$b = 456;
print $a + $b; # imprime 579
print $a . $b; # imprime 123456
Como vemos la primera operación corresponde a una operación entre enteros, mientras que la segunda es la concatenación de Strings. Los tipos de las variables dependerán del contexto en el cual están siendo instanciadas. Paso de parámetros
Perl siempre pasa los parámetros por valor. Si se desea pasar una referencia, como en C, debe primero crearse una variable escalar con esa referencia. Más aún, Perl nunca pasa arreglos o hashes: estas estructuras colapsan a los escalares que las conforman antes de pasarse a una función. Las invocaciones y los retornos pueden pasar tantos parámetros como se desee. Las invocaciones aparecen en la variable local @_.
sub max {
my $max = shift(@_);
foreach $foo (@_) {
$max = $foo if $max < $foo;
}
return $max;
}
...........
$bestday = max($mon,$tue,$wed,$thu,$fri);
Evaluación
Perl hace evaluación completa (o rápida) de expresiones. Exceptuando el código entre comillas entregado al operador eval, todo el código es compilado de inmediato al inicio del programa, y las expresiones se evalúan en cuanto se espera su valor.
Si bien es posible crear funciones anónimas y pasar referencias a ellas, esto no es más que un truco del lenguaje y no puede ser considerado evaluación floja (o lenta).
Concurrencia
Desde la versión 5.005, Perl soporta hebras ("threads''), pero son todavía experimentales. Tiene los mecanismos necesarios para manejo multihebras: hebras asíncronas, entrega de control a otras hebras, espera de término de otra hebra, bloqueos entre variables y funciones, etc. Además, Perl soporta el mecanismo Unix estándar fork/exec para múltiples procesos.
Otras Funcionalidades
Se provee un mecanismo para precompilar Perl a otros lenguajes (C, bytecode) que puede utilizarse para optimizar el tiempo de carga, etc.
Se provee un mecanismo de "chequeo de contaminación'' (taint checking) el cual puede generar programas muy seguros, aún para los más rebuscados inputs. Usado en CGIs, por ejemplo, es mucho mejor que el código C de un programador promedio.
Programas de Ejemplo
Un primer progama de Ejemplo ... "Hello World!"
Este simple programa muestra el uso de "for" con una lista de parámetros que son asignados por turno a una variable anónima. El resultado es "Hello World!"
$hola = "Hello";
$mundo = "world!\n";
for $i ( $hola, $mundo)
{
print $i;
}
Un segundo programa de ejemplo
Este programa cuenta las palabras de un texto que recibe por STDIN. Ilustra varios conceptos típicos de Perl.
while (<>)
{ foreach $i (split){ $i =~ s/^(\w+)$/\L$1/; $v{$i}++; } }
foreach $i (keys %v){ print "$v{$i} veces $i\n" unless $v{$i}==1
}
Este ejemplo ilustra varias cosas tipicas de Perl:
- El uso del ciclo while.
- El uso del operador <> sobre un filehandle, que retorna una línea leida desde él o falso si el archivo retorna EOF. En caso de omitir el filehandle, se usa STDIN. En caso de omitir la variable sobre la cual se debe retornar, se escribe el valor en S.
- El constructor foreach, que itera con una variable anonima sobre todos los valores de una lista.
- La función split, que dado un string devuelve una lista de substrings, separados según una expresión. Si se omite la expresión, separa según los espacios en blanco; si se omite la línea, se usa $_ ( Efectivamente, $_ es una variable que se usa por omisión en muchos lugares).
- El uso del operador s/// para minusculizar una palabra usando expresiones regulares y ``backreferences''.
- El uso de un hash como estructura de memoria: {$}hash\{{$}llave\}.
- La función keys, que retorna todas las llaves definidas de un hash.
- La función print, que expande valores de variables conocidas.
- El constructo unless, que es una especie de if con la condición invertida.
Claridad y Simplicidad
Para programadores con conocimientos en C, awk, sh o incluso BASIC es muy fácil empezar a aprender Perl. Además, dado que generalmente es interpretado, se puede seguir el ciclo escribir/probar muy rápidamente, ayudando aún más el aprendizaje.
La sintaxis es inicialmente muy clara; a medida que el usuario se va familiarizando con los constructos van apareciendo los "trucos sucios" y el poder. La curva de aprendizaje, por lo tanto, es suave (fácil de aprender), y prolongada: hay mucha potencia que extraerle a una sintaxis amplia y rica.
Ortogonalidad
Nula. Hay muchos constructos redundantes en casi cualquier aspecto del lenguaje así como funcionalidades dependientes del contexto en que se trabaja, lo cual redunda en que unas limiten la acción de otras.
Rango de aplicabilidad
Perl es suficientemente flexible y extensible para usar en casi cualquier tarea, desde tareas minúsculas de una línea hasta programas grandes y elaborados. Perl sirve tanto de reemplazo a sh como de lenguaje para proyectos que normalmente se harían en C/C++. Se puede enlazar código Perl dentro de programas C/C++, y se pueden utilizar rutinas C/C++ en programas en Perl.
Por supuesto, existen áreas donde Perl no otorga ninguna utilidad: dominios especializados, dedicados a problemas específicos. Prolog, por ejemplo, o sistemas matemáticos en general.
Ambiente de programación
Dentro de ambientes Unix la programación de aplicaciones Perlresulta ser lo suficientemente cómoda y confiable mediante cualquiera de las heramientas favoritas del programador.
En ambientes no Unix el ambiente puede resultar incómodo y poco usable. En estos casos serían útiles herramientas poderosas de edición como PerlBuilder, el cual es un ambiente integrado de desarrollo que soporta Perl.Sin embargo, los programas Perl son simplemente texto, de modo que conseguir una copia de Emacs o vi para Windows es probablemente la mejor solución
Documentación
Casi todo Perl está claramente documentado en páginas de manual otorgadas por voluntarios, o escritas por compañías formadas en torno a Perl (ver sección de Referencias). Hay muchos tutoriales en torno a las funcionalidades más avanzadas, tutoriales para principiantes, etc. La documentación es probablemente lo que abunda más en Perl, después de JAPHs (Just Another Perl Hacker).
No hay gramática en BNF para Perl: "`La gramática de Perl no puede reducirse a BNF. El trabajo de procesar perl se distribuye entre yacc, el analizador léxico, humo y espejos'' (Chaim Frenkel).
Hay muchos libros sobre Perl: Programming Perl (el conocido "Camel Book''), escrito por el creador de Perl; The Perl Cookbook ("Ram Book''), y Learning Perl ("Llama Book'').
Por supuesto, la mejor documentación son probablemente los grupos de noticias (comp.lang.perl.*), listas de correo y el Web.
Editores
Cualquier editor de texto plano es suficiente para la realización de programas en Perl. En Unix puede ser Emacs, vi o pico. Para Windows es recomendable alguna versión compatible de los 3 mencionados anteriormente.
Depuradores
Perl incluye un parámetro de ejecución, -w, que se usa para lanzar warnings en tiempo de compilación. El intérprete arroja indicaciones incluso por errores a veces poco convencionales, como por ejemplo variables que se usan una sola vez (asume que es un error de tipeo). La mayor parte de los errores triviales se detectan en esta fase (que suele ser mucho más eficiente que la fase de compilado de C, por ejemplo).
Por otro lado, Perl incluye un depurador integrado en el intérprete. El depurador permite analizar estructuras de datos, evaluar expresiones, mostrar volcados de pila, ejecutar líneas o bloques de código, etc.
Portabilidad
Perl es generalmente portable; el mismo código puede llevarse de una arquitectura a otra sin problemas. Hay, por supuesto, algunas funciones que son dependientes de la plataforma (como manejo de señales, saltos de línea, ordenamiento de bytes, largo de números, archivos y muchos otros).
Perl existe en Unix (AIX, BSD/OS, dgux, DYNIX/ptx, FreeBSD, Linux, HP-UX, IRIX, MacOS X, MachTen PPC, NeXT 3 y 4, OpenBSD, OSF1, SCO, SINIX, Unicos, Solaris, SunOS, ...), DOS (MS-DOS, PC-DOS, OS/2, Windows 95/98, Windows NT, Cygwin, ...), MacOS, VMS, VOS, sistemas EBCDIC (OS/390, OS/400, VM/ESA, POSIX/BC), Acorn RISC OS, Amiga, Atari, BeOS, MPE/iX, Novell Netware, Plan9. Lo lamentable es tener que escribir confiando en el mínimo común denominador entre tantos sistemas diferentes. En general, si se tiene cuidado el código puede funcionar de una plataforma a otra de las más comunes, pero no hay que confiar en ello.
Costo de Uso
Esta es una de las grandes ventajas de Perl sobre otros lenguajes. Perl es software libre. Esto significa que el código de Perl está a libre disposición de cualquiera que quiera usarlo. Hay versiones de Perl que son distribuidas comercialmente, y empresas que dan soporte contractualmente, pero esto no significa que el acceso al lenguaje mismo se limite.
El que Perl sea software libre no significa que todo el código que uno escriba debe ponerse a libre disposición de cualquiera. No son raros los sistemas comerciales en Perl cuyo uso o distribución están limitados(Por ejemplo, los sistemas en WWW no tienen por qué entregar el código que están ejecutando), si bien no demasiadas casas comerciales de software otorgan licencias para usar programas en Perl (como se hace con otros lenguajes, sobre todo lenguajes compilados), seguramente por el problema práctico que implica esconder el código.
Ejecución
Para ejecutar código Perl no es necesaria gran potencia de CPU ni memoria. Hay sistemas desarrollados para integrar Perl en servidores web, por ejemplo, que hacen su ejecución más eficiente en términos de CPU (aunque usan más memoria), y máquinas virtuales especiales para hacer la ejecución más eficiente. Esto puede tener un costo económico asociado, por ser software comercial.
Traducción
En general el código Perl no necesita traducción explícita, aunque puede hacerse. Se paga un costo en tiempo de compilación cada vez que se ejecuta el programa, aunque usualmente es bajo.
Creación y desarrollo
Habiendo muchos JAPHs y siendo un lenguaje fácil de aprender, en general no es caro un desarrollo en Perl; mucho más barato que el desarrollo en lenguajes como C, usualmente.
Mantención
La mantención de sistemas en Perl es en general barata. Más aún, un código no ofuscado, bien escrito y bien comentado es en principio fácil de mantener.
Estandarización
Habiendo un grupo encargado del desarrollo general del lenguaje ("Perl Porters''), no hay mayor discrepancia entre versiones, y se logra una compatibilidad hacia atrás y hacia adelante en general bastante alta (nótese que entre Perl 4 y Perl 5 hubo que hacer cambios a algunos programas, pero entre ambas versiones hubo más de tres años de desarrollo). Dado que el núcleo es software libre, ninguna compañía puede apropiarse del lenguaje y hacer versiones modificadas.
No existen versiones ISO o ANSI de Perl.
Manejo de Memoria
Perl emplaza memoria automáticamente para las variables que se usan, y la desplaza automáticamente cuando el programa se sale de su contexto, ya sea léxico (my) o temporal (local).
Funciones Recursivas
Perl soporta el uso de funciones recursivas si bien hay que ser cuidadoso con el entorno en que están definidas las variables. Por ejemplo,
sub fact
{
my $num=shift;
if ($num<=1)
{
return 1;
}
else
{
return $num*fact($num-1);
}
}
Esto retorna el resultado correcto (por ejemplo, fact(5)=120). Sin embargo, quitando el my de la declaración de $num se obtiene 1.
Llamadas a Sistema
Perl tiene completo acceso a las llamadas al sistema, al menos en Unix. La intefaz XS permite llamar funciones C desde Perl. Por otro lado, muchas llamadas al sistema ya están en funciones de bibliotecas o paquetes de Perl. La función syscall puede usarse para acceder a muchas de ellas; la función ioctl se puede utilizar para hacer control de IO; la función fcntl permite manipular descriptores de archivo, etc. Sistema de Objetos
Perl soporta programación orientada a objetos. Tal como se mencionó en Descripción Técnica-Encapsulación Perl provee el manejo de objetos en forma apropiada vía clases (en paquetes) que proveen los métodos para trabajar con los objetos que se definen.
Tipado Fuerte
Las variables simples (escalares, arreglos, hashes) en general no tienen tipos fuertemente enlazados a ellas. La referencias sí los tienen, y las referencias benditas (También conocidas como "objetos'') también los tienen. Bibliotecas
Perl soporta el uso de módulos, también conocidas como bibliotecas de funciones. Hay infinidad de bibliotecas en circulación; muchas de ellas pueden encontrarse en CPAN (Comprehensive Perl Archive Network).
Manejo de Excepciones
Las funciones eval y die se usan corrientemente para capturar y alzar excepciones, respectivamente.
Interfaces Gráficas
Tradicionalmente, las interfaces gráficas en Perl se hacían con Tk, un juego de controles inventado originalmente para Tcl. Hoy en día, el juego de controles GTK+, escrito en C, provee una interfaz que puede manejarse desde Perl. GTK+ se basa en un modelo de contenedores, manejadores y callbacks, y puede usarse para construir interfaces arbitrariamente complejas.
Este último ejemplo ilustra superficialmente el uso de la orientación a objetos de Perl (desde el punto de vista de quien usa una clase) y GTK+.
use Gtk '-init';
my $window = new Gtk::Window;
my $button = new Gtk::Button("Quit");
$button->signal_connect("clicked",
sub {Gtk->main_quit});
$window->add($button);
$window->show_all;
Gtk->main;
Aquí podemos apreciar como se crea una instancia de la clase Window, luego un botón. Luego se asigna un callback (Gtk->main_quit) a un evento (clicked) del botón y se pone el botón en el interior de la ventana. Finalmente se corre el ciclo principal de GTK+ (el cual esperará hasta que el botón reciba el evento (clicked), y entretanto hará las cosas esperadas, como marcar el botón si el puntero del mouse se posa sobre él, etc).
Por qué Perl para el Web?
Perl provee herramientas muy sencillas de uso para la generación de páginas dinámicas vía procesamiento de información de entrada/salida a través del Web. Este hecho masificó el uso de Perl en la creación de scripts para el web así como un sinnúmero de otras aplicaciones. La utilidad de Perl en el web ha ido aumentando notoriamente con el tiempo. Su afinidad con las aplicaciones necesitadas en internet ha hecho sumer esfuerzos en la creación de distintos módulos y bibliotecas orientadas a distintos temas Web.
Construcción de CGIs y Utilidad en HTTP
Por qué Perl es ocupado por tantos programadores en la creació nde CGIs ? La respuesta a esta ointerrogante se encuentra en una de las definiciones básicas de perl como lenguaje de programación : " Perl es un lenguaje interpretado optimizado para el procesamiento de archivos de texto plano, extrayendo información de ellos e imprimiendo reportes en base a esa información"
La mayoría de las aplicaciones CGI involucran la manipulación de datos con acceso a programas externos y aplicaciones. Perl provee una gran cantidad de módulos tanto para la generación de aplicaciones particulares así como la administración de servidores web (en particular Apache), facilitando muchas veces la realización de tareas que en otra instancia resultarían tediosas.
Otra orientación de Perl es el procesamiento de información transmitida vía protocolo HTTP. Un módulo especial de Perl (Lite) provee funcionalidades para el trabajo en este contexto.
Expresiones Regulares
Una de las funcionalidades más poderosas de Perl es su cualidad de realizar calce de patrones de texto a través de "Expresiones Regulares", las cuales representan una forma de expresar un patrón o secuencia de calce. Esta es una herramienta tremendemente poderosa que posee el lenguaje, así como una de sus principales características. En el contexto de web esta característica ha sido tremendamente utilizada en la interpretación de formularios y generación de páginas dinámicas vía cgi. Una reciente utilidad de esta heramienta del lenguaje se encuentra en el procesamiento de documenetos XML.
XML
El reciente módulo Perl XML::Parser permitió a los programadores crear aplicaciones utilizando XML, ocupando una herramienta eficiente y de fácil uso para el procesamiento de este tipo de documentos muy utilizado en la actualidad. La característica inicial de Perl, un lenguaje procesador de información en texto, fue una excelente compatibilidad en este punto.
Referencias y Links
|