You are on page 1of 15

Perl

Perl
Perl Desarrollador(es) Larry Wall [1] www.perl.org Informacin general Paradigma Apareci en Diseado por ltima versin estable multiparadigma, funcional, imperativa, orientado a objetos (basado en clases), reflexiva 1987 Larry Wall 5.18.0 [2] (18 de mayo de 2013)

ltima versin en pruebas 5.19.0[3] (20 de mayo de 2013) Tipo de dato Implementaciones Dialectos Influido por Ha influido a Sistema operativo Licencia Dinmico Perl, mod_perl, embperl Perl 5, Perl 6 AWK, Smalltalk 80, Lisp, C, C++, Pascal, sed, Unix shell Python, PHP, Ruby, ECMAScript, LPC, Windows PowerShell, JavaScript, Falcon Multiplataforma, muchos GPL, Licencia Artstica [4] (ms de 100)

Perl es un lenguaje de programacin diseado por Larry Wall en 1987. Perl toma caractersticas del lenguaje C, del lenguaje interpretado bourne shell (sh), AWK, sed, Lisp y, en un grado inferior, de muchos otros lenguajes de programacin. Estructuralmente, Perl est basado en un estilo de bloques como los del C o AWK, y fue ampliamente adoptado por su destreza en el procesado de texto y no tener ninguna de las limitaciones de los otros lenguajes de script.

Historia
Larry Wall comenz a trabajar en Perl en 1987 mientras trabajaba como programador en Unisys[5] y anunci la versin 1.0 en el grupo de noticias comp.sources.misc el 18 de diciembre de 1987. El lenguaje se expandi rpidamente en los siguientes aos. Perl 2, publicado en 1988, aport un mejor motor de expresiones regulares. Perl 3, publicado en 1989, aadi soporte para datos binarios. Hasta 1991 la nica documentacin de Perl era una simple (y cada vez ms larga) pgina de manual Unix. En 1991 se public Programming Perl (el libro del camello) y se convirti en la referencia de facto del lenguaje. Al mismo tiempo, el nmero de versin de Perl salt a 4, no por marcar un gran cambio en el lenguaje, sino por identificar a la versin que estaba documentada en el libro. Perl 4 trajo consigo una serie de lanzamientos de mantenimiento, culminando en Perl 4.036 en 1993. En este punto, Larry Wall abandon Perl 4 para comenzar a trabajar en Perl 5. Perl 4 se quedara en esa versin hasta hoy. El desarrollo de Perl 5 continu en 1994. La lista de correo perl5-porters se estableci en mayo de 1994 para coordinar el trabajo de adaptacin de Perl 5 a diferentes plataformas. Es el primer foro para desarrollo, mantenimiento y adaptacin de Perl 5.

Perl Perl 5 fue publicado el 17 de octubre de 1994. Fue casi una completa reescritura del intrprete y aadi muchas nuevas caractersticas al lenguaje, incluyendo objetos, referencias, paquetes y mdulos. A destacar, los mdulos proveen de un mecanismo para extender el lenguaje sin modificar el intrprete. Esto permiti estabilizar su ncleo principal, adems de permitir a los programadores de Perl aadirle nuevas caractersticas. El 26 de octubre de 1995, se cre el Comprehensive Perl Archive Network (CPAN). CPAN es una coleccin de sitios web que almacenan y distribuyen fuentes en Perl, binarios, documentacin, scripts y mdulos. Originalmente, cada sitio CPAN deba ser accedido a travs de su propio URL; hoy en da, http:/ / www. cpan. org [6] redirecciona automticamente a uno de los cientos de repositorios espejo de CPAN. En 2008, Perl 5 continua siendo mantenido. Caractersticas importantes y algunas construcciones esenciales han sido aadidas, incluyendo soporte Unicode, Hilos (threads), un soporte importante para la programacin orientada a objetos y otras mejoras.

Nombre
Perl se llam originalmente "Pearl". Larry Wall quera darle al lenguaje un nombre corto con connotaciones positivas; asegura que mir (y rechaz) todas las combinaciones de tres y cuatro letras del diccionario. Tambin consider nombrarlo como su esposa Gloria. Wall descubri antes del lanzamiento oficial que ya exista un lenguaje de programacin llamado PEARL y cambi la ortografa del nombre. El nombre normalmente comienza con mayscula (Perl) cuando se refiere al lenguaje y con minsculas (perl) cuando se refiere al propio programa intrprete debido a que los sistemas de ficheros Unix distinguen maysculas y minsculas. Antes del lanzamiento de la primera edicin de Programming Perl era comn referirse al lenguaje como perl; Randal L. Schwartz, sin embargo, forz el nombre en mayscula en el libro para que destacara mejor cuando fuera impreso. La distincin fue subsiguientemente adoptada por la comunidad. El nombre es descrito ocasionalmente como "PERL" (por Practical Extraction and Report Language - Lenguaje Prctico para la Extraccin e Informe). Aunque esta expansin ha prevalecido en muchos manuales actuales, incluyendo la pgina de manual de Perl, es un retroacrnimo y oficialmente el nombre no quiere decir nada. La ortografa de PERL en maysculas es por eso usada como jerga para detectar a individuos ajenos a la comunidad. Sin embargo, se han sugerido varios retroacrnimos, incluyendo el cmico Pathologically Eclectic Rubbish Lister (Contabilizador de Basura Patolgicamente Eclctico).

El smbolo del camello


Perl se simboliza generalmente por un camello de una sola joroba (camello arbigo o dromedario), que fue la imagen elegida por el editor O'Reilly para la cubierta de Programming Perl, que por consiguiente adquiri el nombre de El Libro del Camello.[5] O'Reilly es propietario de este smbolo como marca registrada, pero dice que usa sus derechos legales slo para proteger la "integridad e impacto de este smbolo".[7] O'Reilly permite el uso no comercial del smbolo, y ofrece logos Programming Republic of Perl [8] y botones Powered by Perl [9]. Desde hace unos aos, y para evitar este tipo de problemas con la licencia comercial, la Fundacin Perl elabor nuevos logotipos basados en una cebolla, a raz de las conferencias anuales que Larry Wall ofrece con el ttulo: State of the Onion ("Estado de la Cebolla") Onion se pronuncia muy parecido a Union, por lo que suena parecido a State of the Union ("Estado de la Unin"), evento en el cual el Presidente de los Estados Unidos informa a los ciudadanos del estado en que se encuentra su pas.

Perl

Descripcin
La pgina de manual Unix perlintro(1) [10] dice: Perl es un lenguaje de propsito general originalmente desarrollado para la manipulacin de texto y que ahora es utilizado para un amplio rango de tareas incluyendo administracin de sistemas, desarrollo web, programacin en red, desarrollo de GUI y ms. Se previ que fuera prctico (facilidad de uso, eficiente, completo) en lugar de hermoso (pequeo, elegante, mnimo). Sus principales caractersticas son que es fcil de usar, soporta tanto la programacin estructurada como la programacin orientada a objetos y la programacin funcional, tiene incorporado un poderoso sistema de procesamiento de texto y una enorme coleccin de mdulos disponibles.

Caractersticas
La estructura completa de Perl deriva ampliamente del lenguaje C. Perl es un lenguaje imperativo, con variables, expresiones, asignaciones, bloques de cdigo delimitados por llaves, estructuras de control y subrutinas. Perl tambin toma caractersticas de la programacin shell. Todas las variables son marcadas con un Sigilo precedente (Sigil, en ingls). Los sigilos identifican inequvocamente los nombres de las variables, permitiendo a Perl tener una rica sintaxis. Notablemente, los sigilos permiten interpolar variables directamente dentro de las cadenas de caracteres (strings). Como en los shell, Perl tiene muchas funciones integradas para tareas comunes y para acceder a los recursos del sistema. Perl toma las listas del Lisp, hash (memoria asociativa) del AWK y expresiones regulares del sed. Todo esto simplifica y facilita todas las formas del anlisis sintctico, manejo de texto y tareas de gestin de datos. En Perl 5, se aadieron caractersticas para soportar estructuras de datos complejas, funciones de primer orden (p. e. clausuras como valores) y un modelo de programacin orientada a objetos. stos incluyen referencias, paquetes y una ejecucin de mtodos basada en clases y la introduccin de variables de mbito lxico, que hizo ms fcil escribir cdigo robusto (junto con el pragma strict). Una caracterstica principal introducida en Perl 5 fue la habilidad de empaquetar cdigo reutilizable como mdulos. Larry Wall indic ms adelante que "la intencin del sistema de mdulos de Perl 5 era apoyar el crecimiento de la cultura Perl en vez del ncleo de Perl".[11] Todas las versiones de Perl hacen el tipificado automtico de datos y la gestin de memoria. El intrprete conoce el tipo y requerimientos de almacenamiento de cada objeto en el programa; reserva y libera espacio para ellos segn sea necesario. Las conversiones legales de tipo se hacen de forma automtica en tiempo de ejecucin; las conversiones ilegales son consideradas errores fatales.

Diseo
El diseo de Perl puede ser entendido como una respuesta a tres amplias tendencias de la industria informtica: rebaja de los costes en el hardware, aumento de los costes laborales y las mejoras en la tecnologa de compiladores. Anteriormente, muchos lenguajes de ordenador como el Fortran y C, fueron diseados para hacer un uso eficiente de un hardware caro. En contraste, Perl es diseado para hacer un uso eficiente de los costosos programadores de ordenador. Perl tiene muchas caractersticas que facilitan la tarea del programador a costa de unos requerimientos de CPU y memoria mayores. stas incluyen gestin de memoria automtica; tipo de dato dinmico; strings, listas y hashes; expresiones regulares; introspeccin y una funcin eval(). Larry Wall fue adiestrado como lingista y el diseo de Perl ha sido muy aleccionado con principios lingsticos. Ejemplos incluyen la Codificacin Huffman (las construcciones ms comunes deben ser las ms cortas), buena distribucin (la informacin importante debe ir primero) y una larga coleccin de primitivas del lenguaje. Perl favorece las construcciones del lenguaje, tan naturales, como para los humanos son la lectura y la escritura, incluso si eso hace ms complicado al intrprete Perl.

Perl La sintaxis de Perl refleja la idea de que "cosas que son diferentes deben parecer diferentes". Por ejemplo, escalares, arrays y hashes tienen diferente sigilo. ndices de array y claves hash usan diferentes clases de parntesis. Strings y expresiones regulares tienen diferentes delimitadores estndar. Esta aproximacin puede contrastarse con lenguajes como Lisp, donde la misma construccin S-expresin y sintaxis bsica se usa para muchos y variados propsitos. Perl tiene caractersticas que soportan una variedad de paradigmas de programacin, como la imperativa, funcional y la orientada a objetos. Al mismo tiempo, Perl no obliga a seguir ningn paradigma en particular, ni obliga al programador a elegir alguna de ellas. Hay un amplio sentido de lo prctico, tanto en el lenguaje Perl como en la comunidad y la cultura que lo rodean. El prefacio de Programming Perl comienza con, "Perl es un lenguaje para tener tu trabajo terminado". Una consecuencia de esto es que Perl no es un lenguaje ordenado. Incluye caractersticas si la gente las usa, tolera excepciones a las reglas y emplea la heurstica para resolver ambigedades sintcticas. Debido a la naturaleza indulgente del compilador, a veces los errores pueden ser difciles de encontrar. Hablando del variado comportamiento de las funciones internas en los contextos de lista y escalar, la pgina de manual de perlfunc(1) dice "En general, hacen lo que tu quieras, siempre que quieras la coherencia." Perl tiene varios lemas que transmiten aspectos de su diseo y uso. Uno es There's more than one way to do it (Hay ms de una forma de hacerlo) (TMTOWTDI, usualmente pronunciado 'Tim Toady'). Otros son "Perl: la motosierra del ejrcito Suizo de los lenguajes de programacin" y "Lmites imprecisos". Una meta prefijada de Perl es hacer las cosas fciles de forma fcil y las tareas difciles, posibles. A Perl tambin se le ha llamado "El esparadrapo de Internet".

Aplicaciones
Perl tiene muchas y variadas aplicaciones, gracias a la disponibilidad de muchos mdulos estndares y de terceras partes. Se ha usado desde los primeros das del Web para escribir guiones (scripts) CGI. Es una de las "tres Pes" (Perl, Python y PHP), que son los lenguajes ms populares para la creacin de aplicaciones Web, y es un componente integral de la popular solucin LAMP para el desarrollo web. Grandes proyectos escritos en Perl son Slash, IMDb[12] y UseModWiki, un motor de Wiki. Muchos sitios web con alto trfico, como Amazon.com y Ticketmaster.com usan Perl extensamente. Perl se usa a menudo como un "lenguaje pegamento", ligando sistemas e interfaces que no fueron diseados especficamente para interoperar; y para el "escarbado de datos", convirtiendo o procesando grandes cantidades de datos para tareas como por ejemplo crear informes. De hecho, estas fortalezas estn ntimamente unidas. Su combinacin hace a Perl una popular herramienta de propsito general para los administradores de sistemas, especialmente en programas pequeos que pueden ser escritos y ejecutados en una sola lnea de comandos. Perl es tambin ampliamente usado en finanzas y bioinformtica, donde es apreciado por su desarrollo rpido, tanto de aplicaciones como de despliegue, as como la habilidad de manejar grandes volmenes de datos.

Implementacin
Perl est implementado como un intrprete, escrito en C, junto con una gran coleccin de mdulos, escritos en Perl y C. La distribucin fuente tiene, en 2005, 12 MB cuando se empaqueta y comprime en un fichero tar. El intrprete tiene 150.000 lneas de cdigo C y se compila en un ejecutable de 1 MB en las arquitecturas de hardware ms tpicas. De forma alternativa, el intrprete puede ser compilado como una biblioteca y ser embebida en otros programas. Hay cerca de 500 mdulos en la distribucin, sumando 200.000 lneas de Perl y unas 350.000 lneas adicionales de cdigo C. Mucho del cdigo C en los mdulos consiste en tablas de codificacin de caracteres. El intrprete tiene una arquitectura orientada a objetos. Todos los elementos del lenguaje Perl escalares, listas, hashes, referencias a cdigo, manejadores de archivo estn representados en el intrprete como estructuras C. Las

Perl operaciones sobre estas estructuras estn definidas como una numerosa coleccin de macros, typedef y funciones; esto constituye la API C de Perl. La API Perl puede ser desconcertante para el no iniciado, pero sus puntos de entrada siguen un esquema de nombres coherente, que ayuda a los que quieran utilizarla. La ejecucin de un programa Perl se puede dividir, generosamente, en dos fases: tiempo de compilacin y tiempo de ejecucin.[13] En tiempo de compilacin el intrprete parsea el texto del programa en un rbol sintctico. En tiempo de ejecucin, ejecuta el programa siguiendo el rbol. El texto es parseado slo una vez y el rbol sintctico es optimizado antes de ser ejecutado, para que la fase de ejecucin sea relativamente eficiente. Las optimizaciones del rbol sintctico en tiempo de compilacin incluyen simplificacin de expresiones constantes, propagacin del contexto y optimizacin en trozos sueltos de cdigo. Sin embargo, las fases de compilacin y ejecucin pueden anidarse: un bloque BEGIN se ejecuta en tiempo de compilacin, mientras que una funcin eval inicia una compilacin durante una ejecucin. Ambas operaciones estn implcitas en otras -de forma notable, la clusula use que carga bibliotecas, conocidas en Perl como mdulos, implica un bloque BEGIN. Perl es un lenguaje dinmico y tiene una gramtica sensible al contexto que puede quedar afectada por el cdigo ejecutado durante una fase de ejecucin intermedia (Ver ejemplos.[14]). Por eso Perl no puede ser parseado mediante una aplicacin directa de analizadores sintcticos/parseadores Lex/Yacc. En cambio, el intrprete implementa su propio analizador lxico, que coordinado con un parseador modificado GNU bison resuelve las ambigedades del lenguaje. Se ha dicho que "slo perl puede parsear Perl", queriendo decir que slo el intrprete Perl (perl) puede parsear el lenguaje Perl (Perl). La razn de esto se atestigua por las persistentes imperfecciones de otros programas que emprenden la tarea de parsear Perl, como los analizadores de cdigo y los auto-indentadores, que tienen que vrselas no slo con las muchas formas de expresar inequvocamente construcciones sintcticas, sino tambin con el hecho de que tambin Perl no puede, en general, ser parseado sin antes ser ejecutado. El mantenimiento del intrprete Perl, a lo largo de los aos, se ha vuelto cada vez ms difcil. El ncleo ha estado en continuo desarrollo desde 1994. El cdigo ha sido optimizado en rendimiento a expensas de la simplicidad, claridad y unas interfaces internas ms fuertes. Nuevas caractersticas han sido aadidas, manteniendo todava, compatibilidad virtualmente completa hacia atrs con las primeras versiones. El tamao y la complejidad del intrprete son una barrera para los desarrolladores que desean trabajar en l. Perl es distribuido con unos 120.000 test funcionales. stos se ejecutan como parte del proceso normal de construccin y comprueban extensamente al intrprete y a sus mdulos principales. Los desarrolladores Perl confan en los test funcionales para asegurarse que los cambios en el intrprete no introducen errores; recprocamente, los usuarios Perl que vean al intrprete pasar los test funcionales en su sistema pueden tener un alto grado de confianza de que est funcionando adecuadamente. No hay una especificacin o estndar escrito para el lenguaje Perl y no hay planes de crear uno para la versin actual de Perl. Siempre ha existido slo una implementacin del intrprete. Este intrprete, junto con los test funcionales, forman la especificacin de facto del lenguaje.

Disponibilidad
Perl es software libre y est licenciado bajo la Licencia Artstica y la GNU General Public License. Existen distribuciones disponibles para la mayora de sistemas operativos. Est especialmente extendido en Unix y en sistemas similares, pero ha sido portado a las plataformas ms modernas (y otras ms obsoletas). Con slo seis excepciones confirmadas, puede ser compilado desde el cdigo fuente en todos los Unix, compatibles POSIX o cualquier otra plataforma Unix compatible. Sin embargo, esto no es normalmente necesario, porque Perl est incluido por defecto en la instalacin de los sistemas operativos ms populares.[] Debido a los cambios especiales necesarios para soportar al Mac OS Classic, existe una adaptacin especial llamada MacPerl [15].[]

Perl GNU/Linux Perl est instalado por defecto en las distribuciones ms populares de GNU/Linux incluyendo Gentoo, Slackware, Mandriva, Debian, RedHat y SUSE. Windows Los usuarios de Microsoft Windows normalmente instalan una distribucin binaria de Perl.[16] Compilar Perl desde el cdigo fuente bajo Windows es posible, pero la mayora de las instalaciones no disponen del necesario compilador de C. La capa de emulacin Cygwin proporciona otra forma de correr Perl bajo Windows. Cygwin proporciona en entorno parecido al Unix en Windows que incluye gcc, por lo que compilar Perl desde el cdigo es una opcin accesible para los usuarios que prefieren esta opcin. En junio de 2006, win32.perl.org fue lanzado por Adam Kennedy en nombre de la Fundacin Perl. Es una comunidad web "para todo lo relacionado con Windows y Perl".[]

Estructura del lenguaje


Programa ejemplo
En Perl, el programa cannico "Hola mundo" es: #!/usr/bin/perl print "Hola mundo!\n"; La primera lnea contiene el shebang (par de caracteres que identifica el texto que sigue), que le indica al sistema operativo dnde encontrar el intrprete de Perl. La segunda imprime el string Hola mundo! y un carcter de nueva lnea. El shebang es la forma normal para invocar al intrprete en los sistemas Unix. Los sistemas Windows pueden seguir utilizndolo o pueden asociar la extensin de archivo .pl con el intrprete Perl. Algunos editores de texto tambin usan la lnea shebang como una pista sobre el modo de trabajo en que deben operar. Si el programa es ejecutado por perl y no invocado por el shell, la lnea que empieza por el shebang es parseada para interpretar las opciones. En otro caso, es ignorada. Para ver los detalles de esto, consultar la pgina de manual perlrun [17].

Tipos de datos
Perl tiene tres tipos de datos: escalares, listas y hashes: Un escalar es un solo valor; puede ser un nmero, un string (cadena de caracteres) o una referencia Una lista es una coleccin ordenada de escalares (una variable que almacena una lista se llama array) Un hash, o memoria asociativa, es un mapeo de strings a escalares; los strings se llaman claves y los escalares valores. Todas las variables estn precedidas por un sigilo, que identifica el tipo de dato que es accedido (no el tipo de dato de la misma variable). Se puede usar el mismo nombre para variables de diferentes tipos, sin que tengan conflictos. $var @var %var # un escalar # un array # un hash

Los nmeros se escriben de la forma usual; los strings estn rodeados entre comillas de varias clases. $n = 42; $nombre = "juan";

Perl $color = 'rojo';

Perl convertir los strings en nmeros y viceversa dependiendo del contexto en que sean usados. En el siguiente ejemplo los strings $n y $m son tratados como nmeros cuando son argumentos del operador suma. Este cdigo imprime el nmero '5', desechando cualquier informacin no numrica de la operacin y dejando los valores de las variables intactos. (El operador de concatenacin no es +, sino ..) $n = "3 manzanas"; $m = "2 naranjas"; print $n + $m; Perl tambin tiene un contexto booleano que utiliza en la evaluacin de declaraciones condicionales. Los siguientes valores en Perl evalan todos como falso: $falso $falso $falso $falso $falso = = = = = 0; 0.0; '0'; ""; undef; # # # # # el el el el el nmero cero nmero cero como flotante string cero string vaco valor devuelto por undef

Todos los dems valores se evalan a verdadero. Esto incluye el curioso string auto-descriptivo "0 pero verdadero", que de hecho es 0 como nmero, pero verdadero como booleano. (Cualquier string no numrico tambin tendr esta propiedad, pero este string en particular es ignorado por Perl en contextos numricos). Las expresiones booleanas evaluadas tambin devuelven valores escalares. Aunque la documentacin no indica qu valor particular se devuelve como verdadero o falso (y por lo tanto no fiable), muchos operadores booleanos devuelven 1 por verdadero y el string vaco para falso (que evala a cero en contexto numrico). La funcin defined() le dice si la variable tiene algn valor. En el ejemplo anterior defined($falso) ser verdadero con cada uno de los valores anteriores, excepto undef. Si, especficamente, quiere asegurarse de tener un resultado 1/0 (como en C), necesita realizar el clculo siguiente: my $resultado_real = $resultado_booleano ? 1 : 0; Una lista se define listando sus elementos, separados por comas y rodeados por parntesis donde as sea requerido por la precedencia de los operadores. @puntuaciones = (32, 45, 16, 5); Un hash puede ser inicializado desde una lista de pares clave/valor. %favorito = ( joe => 'rojo', sam => 'azul', ); Los elementos individuales de una lista son accedidos utilizando un ndice numrico, dentro de corchetes. Valores individuales en un hash son accedidos utilizando la correspondiente clave, dentro de llaves. El sigilo $ identifica que el elemento accedido es un escalar. $puntuaciones[2] $favorito{joe} # un elemento de @puntuaciones # un valor de %favorito

Mltiples elementos pueden ser accedidos usando en su lugar el sigilo @ (identificando el resultado como una lista).

Perl @puntuaciones[2, 3, 1] @favorito{'joe', 'sam'} # tres elementos de @puntuaciones # dos valores de %favorito

El nmero de elementos en un array puede ser obtenido evaluando el array en contexto escalar o con la ayuda del sigilo $#. ste ltimo da el ndice del ltimo elemento dentro del array, no el nmero de elementos. $numero = @amigos; $#amigos; # el ndice del ltimo elemento en @amigos $#amigos+1; # normalmente el nmero de elementos en @amigos, # que es uno ms que $#amigos porque el primer elemento tiene el ndice 0, no 1 Hay unas pocas funciones que operan sobre hashes enteros. @nombres_de_clientes @nombres_de_clientes @direcciones_de_email @direcciones_de_email = keys %direcciones; # guarda en todas las claves de %direcciones = values %direcciones; # guarda en todos los valores de %direcciones

Estructuras de control
Perl tiene varias clases de estructuras de control. Tiene estructuras de control orientado al bloque, similar a los de los lenguajes de programacin C y Java. Las condiciones estn rodeadas por parntesis y los bloques subordinados por llaves:
etiqueta while ( condicin ) {... } etiqueta while ( condicin ) {... } continue {... } etiqueta for ( expresin inicial; expresin condicional; expresin incremental ) {... } etiqueta foreach var ( lista ) {... } etiqueta foreach var ( lista ) {... } continue {... } if ( condicin ) {... } if ( condicin ) {... } else {... } if ( condicin ) {... } elsif ( condicin ) {... } else {... }

Cuando se controla a una sola declaracin, los modificadores de declaracin proporcionan una sintaxis ms ligera: declaracin declaracin declaracin declaracin declaracin if unless while until foreach condicin; condicin; condicin; condicin; lista;

Los operadores lgicos cortocircuito son normalmente usados para controlar el flujo del programa a nivel de expresin: expr and expr expr or expr Las palabras clave de control de flujo next, last, return y redo son expresiones, por lo que pueden ser usadas con los operadores cortocircuito. Perl tambin tiene dos construcciones implcitas para bucles:

Perl resultados = grep {... } lista resultados = map {... } lista grep devuelve todos los elementos de lista en que el bloque subordinado evala a verdadero. map evala el bloque subordinado por cada elemento de lista y devuelve una lista de los valores resultantes. Estas construcciones permiten un estilo simple de programacin funcional. No hay declaracin switch (salto multi-camino) en Perl 5. La documentacin Perl describe media docena de formas de conseguir el mismo efecto usando otras estructuras de control. Existe sin embargo un mdulo Switch [18], que proporciona la funcionalidad modelada para el prximo Perl 6. Perl incluye una declaracin goto etiqueta, pero es usada raramente. Las situaciones donde en otros lenguajes se utiliza goto no ocurren tan a menudo en Perl debido a sus amplias opciones de control de flujo. Existe tambin una declaracin goto &sub que realiza una llamada 'final'. Termina la subrutina actual e inmediatamente llama a la sub especificada. Esto se usa en situaciones donde una nueva subrutina puede realizar una gestin de la pila ms eficiente que el propio Perl (porque tpicamente no se requiere ningn cambio en la pila actual), y en una recursin muy profunda este tipo de llamadas puede tener un sustancial impacto positivo en el funcionamiento porque evita la sobrecarga de la gestin contexto/pila en el momento de retornar.

Subrutinas
Las subrutinas se definen con la palabra clave sub e invocadas simplemente nombrndolas. Si la subrutina en cuestin no ha sido todava declarada, es necesario, para el proceso de anlisis sintctico, poner los parntesis. foo(); sub foo {... } foo; # parntesis necesarios aqu... #... pero no aqu

Una lista de argumentos pueden ser indicados despus del nombre de la subrutina. Los argumentos pueden ser escalares, listas o hashes. foo $x, @y, %z; Los parmetros de una subrutina no necesitan ser declarados, ni en nmero ni en tipo; de hecho, pueden variar en cada llamada. Los arrays son expandidos a sus elementos, los hashes a una lista de pares clave/valor y todo el conjunto es pasado a la subrutina como una indiferenciada lista de escalares. Cualesquiera de los argumentos pasados estn disponibles para la subrutina en el array especial @_. Los elementos de @_ son asociados a los argumentos actuales; cambiando un elemento de @_ cambia el argumento correspondiente. Los elementos de @_ pueden ser accedidos con los subndices de la forma normal. $_[0], $_[1] Sin embargo, el cdigo resultante puede ser difcil de leer y los parmetros tener una semntica de pase por referencia, que puede resultar algo no deseable. Un modismo comn es asignar @_ a una lista de variables con nombres. my($x, $y, $z) = @_; Esto afecta tanto a la mnemnica de los nombres de los parmetros como a la semntica de los valores pasados por valor. La palabra clave my indica que las siguientes variables estn lxicamente embebidas en el bloque que las contienen. Otro modismo es sacar los parmetros de @_. Esto es muy comn cuando la subrutina toma un slo argumento.

Perl my $x = shift; # Si no se dice nada, nos referimos a @_

10

Las subrutinas pueden devolver valores. return 42, $x, @y, %z; Si la subrutina no sale va declaracin return, entonces devuelve la ltima expresin evaluada en el cuerpo de la subrutina. Arrays y hashes en el valor de retorno son expandidos a una lista de escalares, igual que si fueran argumentos de una funcin. La expresin devuelta es evaluada en el contexto de la llamada de la subrutina; esto puede sorprender al desprevenido. sub lista { (4, 5, 6) } sub array { @x = (4, 5, 6); @x } $x $x @x @x = = = = lista; array; lista; array; # # # # devuelve devuelve devuelve devuelve 6 3 (4, (4, ltimo elemento de la lista nmero de elementos de la lista 5, 6) 5, 6)

Una subrutina puede descubrir su contexto de llamada con la funcin wantarray. sub cualquiera { wantarray ? (1, 2) : "Naranjas" } $x = cualquiera; @x = cualquiera; # devuelve "Naranjas" # devuelve (1, 2)

Expresiones regulares
El lenguaje Perl incluye una sintaxis especializada para escribir expresiones regulares y el intrprete contiene un motor para emparejar strings con expresiones regulares. El motor de expresiones regulares usa un algoritmo de Vuelta Atrs (backtracking), extendiendo sus capacidades desde el simple emparejamiento de patrones simples con la captura y sustitucin de strings. El motor de expresiones regulares se deriva de regex, escrito por Henry Spencer. La sintaxis de expresiones regulares fue originalmente tomada de las expresiones regulares de Unix Versin 8. Sin embargo, se diferenci ya antes del primer lanzamiento de Perl y desde entonces ha ido incorporando muchas ms caractersticas. Otros lenguajes y aplicaciones estn adoptando las expresiones regulares de Perl (PCRE) en vez de las expresiones regulares POSIX, incluyendo PHP, Ruby, Java y el Servidor HTTP Apache. El operador m// (empareja) permite comprobar un emparejamiento por medio de una expresin regular. (Para abreviar, el precedente m puede ser omitido.) En el caso ms simple, una expresin como: $x =~ m/abc/ evala a verdadero si y slo si el string $x empareja con la expresin regular abc. Partes de la expresin regular pueden ser incluidas entre parntesis: las partes correspondientes de un string emparejado son capturadas. Los strings capturados son asignados de forma secuencial a las variables internas $1, $2, $3,... y una lista de strings capturados se devuelve como valor del emparejamiento. $x =~ m/a(.)c/; # captura el carcter entre 'a' y 'c' y lo guarda en $1

El operador s/// (sustitucin) especifica una operacin de bsqueda y reemplazo: $x =~ s/abc/aBc/; # Convierte la b en mayscula

Perl Las expresiones regulares en Perl pueden tomar unos modificadores. Son sufijos de una sola letra que modifican el significado de la expresin:
$x =~ m/abc/i; $x =~ s/abc/aBc/g; # emparejamiento independientemente de si estn en mayscula o minscula # bsqueda y reemplazo global (a lo largo de todo el string)

11

Las expresiones regulares pueden ser densas y crpticas. Esto es porque la sintaxis de las expresiones regulares es extremadamente compacta, generalmente usando caracteres sueltos o pares de caracteres que representan sus operaciones. Perl alivia un poco este problema con el modificador /x que permite a los programadores poner espacio en blanco y comentarios dentro de las expresiones regulares: $x =~ m/a . c /x; Un uso comn de las expresiones regulares es el de especificar delimitadores de campos al operador split:
@palabras = split m/,/, $lnea; # divide la $lnea de valores separados por comas

# empareja una 'a' # empareja cualquier carcter # empareja una 'c'

El operador split complementa la captura de string. La captura de string devuelve las partes de un string que emparejan con una expresin regular; split devuelve las partes que no emparejan.

Interfaz con bases de datos


Perl est ampliamente favorecido para las aplicaciones de bases de datos. Sus facilidades de manejo de texto son buenas para generar consultas SQL; arrays, hashes y la gestin de memoria automtica hace fcil recoger y procesar los datos devueltos. En las primeras versiones de Perl, las interfaces de bases de datos fueron creadas enlazando el intrprete con una biblioteca de base de datos desde el lado del cliente. Esto era algo torpe; un problema en particular fue que el ejecutable perl resultante estaba restringido a usar slo una interfaz de base de datos, la que haba sido enlazada. Tambin, reenlazar el intrprete era lo suficientemente dificultoso que slo fue realizado para algunas de las ms famosas e importantes bases de datos. En Perl 5, las interfaces de bases de datos estn implementadas por el mdulo Perl DBI. El mdulo DBI presenta una nica interfaz a las aplicaciones Perl, independiente de las bases de datos, mientras que los mdulos DBD:: (Controlador de base de datos) manejan los detalles de acceso a unas 50 bases de datos diferentes. Existen controladores DBD:: para la mayor parte de las bases de datos ANSI SQL.

Comparativa de funcionamiento
El "Computer Language Shootout Benchmarks" [19] compara el funcionamiento de implementaciones de problemas de programacin tpicos, en diversos lenguajes. Sus implementaciones Perl normalmente toman ms memoria que las implementaciones en otros lenguajes, y esto vara los resultados de velocidad. Las prestaciones de Perl son similares a las de otros lenguajes como Python, PHP o Ruby, pero ms lento que la mayor parte de lenguajes compilados. Perl puede ser ms lento que otros lenguajes haciendo lo mismo porque tiene que compilar el cdigo fuente cada vez que corre el programa. En "A Timely Start" [20], Jean-Louis Leroy encontr que sus scripts en Perl tardaban mucho ms tiempo en correr que lo que l esperaba porque el intrprete perl perda la mayor parte del tiempo buscando y compilando los mdulos. Como Perl no puede salvar su compilacin intermedia como lo hacen Java, Python y Ruby, los scripts Perl conllevan esta sobrecarga en cada ejecucin. La sobrecarga no es un problema cuando la fase de ejecucin es muy larga, pero puede sesgar significativamente en tiempos de ejecucin muy cortos, como se

Perl encuentra a menudo en los benchmarks. Una vez que perl inicia la fase de ejecucin, sin embargo, puede ser muy rpido y tpicamente supera a otros lenguajes dinmicos. Tecnologas como mod perl superan esto guardando el programa compilado en memoria entre ejecuciones, o Class::Autouse [21] que retrasa la compilacin de partes del programa hasta que son necesarias.

12

Optimizando
Nicholas Clark, un desarrollador principal de Perl, diserta sobre algunas mejoras en el diseo con Perl y otras soluciones en "When perl is not quite fast enough" [22]. Las rutinas ms crticas de un programa Perl pueden escribirse en C o incluso en lenguaje ensamblador con XS o Inline [23]. Optimizar Perl puede requerir un conocimiento ntimo de su funcionamiento en lugar de la destreza con el lenguaje y su sintaxis, significando que el problema est con la implementacin de Perl en lugar de con el lenguaje mismo. Perl 6, la siguiente versin, tomar algunas de estas ideas como lecciones, que otros lenguajes ya han aprendido.

Futuro
En el ao 2000, en la conferencia Perl, Jon Orwant hizo una peticin para una nueva versin del lenguaje.[24] Esto condujo a una decisin para comenzar el trabajo del rediseo del lenguaje, que se llamara Perl 6. Se pidieron propuestas a la comunidad Perl para las nuevas caractersticas del lenguaje, y se recibieron ms de 300 RFC (del ingls Request For Comments, peticin de comentarios). Larry Wall estuvo los siguientes aos digiriendo los RFC y sintetizndolos en un entorno de trabajo coherente para Perl 6. Present su diseo de Perl 6 en una serie de documentos llamados Apocalipsis, que se numeran para corresponderse con los captulos de Programming Perl. La actual, inacabada especificacin de Perl 6, est resumida en unos documentos de diseo llamados Sinopsis, que estn numerados para corresponder a los Apocalipsis. Perl 6 no tiene la intencin de ser compatible para atrs, aunque existir un modo de compatibilidad. En 2001 se decidi que Perl 6 corriese en una mquina virtual llamada Parrot. Esto quiere decir que otros lenguajes que usen Parrot podrn ganar acceso nativo a CPAN y permitir algn cierto nivel de desarrollo cruzado. En 2005 Audrey Tang cre el proyecto pugs, una implementacin de Perl 6 en Haskell. Fue y es una plataforma de testeo del lenguaje Perl 6 (separado del desarrollo actual de la implementacin) permitiendo a los diseadores explorar. El proyecto pugs engendr una activa comunidad Perl/Haskell centrada alrededor del canal irc #perl6 en Freenode. Un cierto nmero de caractersticas en el lenguaje Perl 6 muestran una similaridad con las de Haskell y Perl 6 ha sido acogido por la comunidad Haskell como un potencial lenguaje de scripting. En el 2006, Perl 6, Parrot y pugs siguen estando bajo desarrollo y un nuevo mdulo para Perl 5 llamado v6 permite a una parte del cdigo Perl 6 correr directamente sobre Perl 5.

Diversin con Perl


Como en C, las competiciones de cdigo ofuscado son un rasgo popular de la cultura Perl. El Obfuscated Perl contest homenajea la virtud de la flexibilidad sintctica de Perl. El programa siguiente imprime el texto "Just another Perl / Unix hacker", usando 32 procesos en paralelo coordinados con pipes. La explicacin completa est disponible en el sitio web del autor [25]. @P=split//,".URRUU\c8R";@d=split//,"\nrekcah xinU / lreP rehtona tsuJ";sub p{ @p{"r$p","u$p"}=(P,P);pipe"r$p","u$p";++$p;($q*=2)+=$f=!fork;map{$P=$P[$f^ord ($p{$_})&6];$p{$_}=/ ^$P/ix?$P:close$_}keys%p}p;p;p;p;p;map{$p{$_}=~/^[P.]/&&

Perl close$_}%p;wait until$?;map{/^r/&&<$_>}%p;$_=$d[$q];sleep rand(2)if/\S/;print De forma similar al cdigo ofuscado pero con un propsito diferente, "Poesa Perl" es la prctica de escribir poemas que puedan ser compilados como cdigo legal de Perl (aunque generalmente sin sentido). Esta aficin es ms o menos nica en Perl debido al gran nmero de palabras normales del Ingls que el lenguaje utiliza. Los nuevos poemas se publican de forma regular en el sitio Perl Monks, en la seccin Poesa Perl [26]. Parte del saber de Perl est en Black Perl, un ejemplo infame de la potica de Perl. Otro pasatiempo es "Perl Golf". Como con el deporte real, la meta es reducir el nmero de golpes necesarios para completar un objetivo, pero aqu, los "golpes" se refieren a los pulsaciones de teclado en vez de a los recorridos en un club de golf. Se propone una tarea, como "escanear un string de entrada y devolver el palndromo ms grande que contenga" y los participantes intentan batir a sus oponentes escribiendo soluciones que requieran cada vez menos caracteres de cdigo fuente Perl. Otra tradicin entre los hackers Perl es escribir JAPH, que es una especie de pequeos programas ofuscados que imprimen la frase "Just another Perl hacker,". El "cannico" JAPH incluye la coma al final, aunque a menudo se omite, y otras muchas variantes que se han creado (ejemplo,[27] que imprime "Just Another Perl Pirate!"). Un mdulo Perl interesante es Lingua::Romana::Perligata [28] (en CPAN [29]). Este mdulo traduce el cdigo fuente de un script escrito en Latn a Perl, permitiendo al programador escribir programas ejecutables en Latn. La comunidad Perl ha reservado el espacio de nombres "Acme" para los mdulos que sean divertidos o experimentales. Algunos de los mdulos Acme estn implementados de maneras muy entretenidas. Algunos ejemplos: Acme::Bleach [30], uno de los primeros mdulos en Acme:: [31], permite al cdigo fuente de un programa ser "blanqueado" (es decir, todos los caracteres son reemplazados por el espacio en blanco) y seguir funcionando. Es un ejemplo de un filtro de cdigo fuente. Hay tambin un cierto nmero de otros filtros de fuente en el espacio de nombres Acme. Acme::Hello [32] simplifica el proceso de escribir un programa "Hello, World!" Acme::Currency [33] permite cambiar el prefijo "$" de las variables escalares por otro carcter (por defecto usa el euro "") Acme::ProgressBar [34] es, completamente hecho a propsito, una horrible e ineficiente forma de indicar el progreso de una tarea Acme::VerySign [35] satiriza el largamente criticado servicio Site Finder de VeriSign Acme::Don't [36] implementa el opuesto lgico de la palabra clave do don't, que no ejecuta el bloque de cdigo subordinado.

13

Enlaces relacionados
Humor Perl en Wikibooks Lingua::Romana::Perligata - Escribe Perl en Latn! [37] Un tutorial sobre Perligata [38] Test de Pureza Perl [39]

Referencias
[1] http:/ / www. perl. org [4] http:/ / www. cpan. org/ ports/ [5] (ingls) [6] http:/ / www. cpan. org [8] http:/ / www. oreillynet. com/ images/ perl/ sm_perl_id_bk_wt. gif [9] http:/ / www. oreillynet. com/ images/ perl/ powered_by_perl. gif

Perl
[10] http:/ / perldoc. perl. org/ perlintro. html [11] Usenet post, May 10th 1997, with ID 199705101952.MAA00756@wall.org. [13] Una descripcin del intrprete Perl 5 se puede encontrar en Programming Perl, 3rd Ed., captulo 18 (http:/ / www. oreilly. com/ catalog/ pperl3/ chapter/ ch18. html) (ingls) [15] http:/ / www. macperl. com/ [17] http:/ / perldoc. perl. org/ perlrun. html#DESCRIPTION [18] http:/ / search. cpan. org/ perldoc/ Switch [19] http:/ / shootout. alioth. debian. org/ [20] http:/ / www. perl. com/ pub/ a/ 2005/ 12/ 21/ a_timely_start. html [21] http:/ / search. cpan. org/ perldoc/ Class::Autouse [22] http:/ / www. ccl4. org/ ~nick/ P/ Fast_Enough/ [23] http:/ / search. cpan. org/ perldoc/ Inline [24] Transcripcin de la charla de Larry (http:/ / www. nntp. perl. org/ group/ perl. perl6. meta/ 424). Anotada el 28 de septiembre de 2006. (ingls) [25] http:/ / perl. plover. com/ obfuscated/ [26] http:/ / www. perlmonks. org/ index. pl?node=Perl%20Poetry [28] http:/ / www. csse. monash. edu. au/ ~damian/ papers/ HTML/ Perligata. html [29] http:/ / search. cpan. org/ dist/ Lingua-Romana-Perligata/ [30] http:/ / search. cpan. org/ dist/ Acme-Bleach/ [31] http:/ / use. perl. org/ ~acme/ journal/ 200 [32] http:/ / search. cpan. org/ dist/ Acme-Hello/ [33] http:/ / search. cpan. org/ dist/ Acme-Currency/ [34] [35] [36] [37] [38] [39] http:/ / search. cpan. org/ dist/ Acme-ProgressBar/ http:/ / search. cpan. org/ dist/ Acme-VerySign/ http:/ / search. cpan. org/ ~dconway/ Acme-Don-t-1. 01/ t. pm http:/ / search. cpan. org/ perldoc?Lingua::Romana::Perligata http:/ / www. perlmonks. org/ index. pl?node_id=253797 http:/ / www. softpanorama. org/ Bulletin/ Humor/ humor092. html

14

Enlaces externos
Wikimedia Commons alberga contenido multimedia sobre Perl. Commons Wikilibros Wikilibros alberga un libro o manual sobre Programacin en Perl. Perl.org (http://www.perl.org/) El directorio Perl Perl.com (http://www.perl.com/) Perl en O'Reilly Network Perldoc at Perl.org (http://perldoc.perl.org/) documentacin online de Perl Documentacin Perl en espaol (https://github.com/zipf/perldoc-es) Proyecto de traduccin de las pginas del manual de Perl a espaol. Desarrollo de Perl 5 (http://dev.perl.org/perl5/) y Perl 6 (http://dev.perl.org/perl6/) Parrot mquina virtual (http://www.parrotcode.org/) Distribuciones The CPAN (http://www.cpan.org/) Comprehensive Perl Archive Network, distribucin fuente de Perl ActiveState ActivePerl (http://www.activestate.com/) Perl para Microsoft Windows y otras plataformas IndigoPerl (http://www.indigostar.com/indigoperl.htm) otra distribucin de Perl para Microsoft Windows Cygwin (http://cygwin.com/) tambin distribuye Perl en Windows Strawberry Perl (http://strawberryperl.com/) - una implementacin open-source para Windows. sitios web sobre Perl (http://dmoz.org/Computers/Programming/Languages/Perl/) en el Open Directory Project

Fuentes y contribuyentes del artculo

15

Fuentes y contribuyentes del artculo


Perl Fuente: http://es.wikipedia.org/w/index.php?oldid=67036845 Contribuyentes: 217-126-21-131.uc.nombres.ttd.es, A ver, Afato, Airwolf, AlexGPL, Allforrous, Ascnder, Biasoli, Bibliofilotranstornado, Bishibosh, Carcediano, Ciencia Al Poder, Cinabrium, CommonsDelinker, DJ Nietzsche, Danielba894, Dodo, Dunadar, Dusan, Echiner, Efe.uno, Elabra sanchez, Elwikipedista, Francisolb, Gacpro, GermanX, Gronky, Interwiki, Inu, Iree7, Ivan rome, JEDIKNIGHT1970, Jecanre, Jferrero, Jjmerelo, JoaquinFerrero, Jondel, Juanan Ruiz, Kresp0, Laertiada, Lainmlh, Leonpolanco, Levhita, Locovich, Lucas6534, M1ss1ontomars2k4, Maldoror, Maveric149, Moriel, Mortadelo2005, Obelix83, Pasqual, Poc-oban, Psicobyte, PuercoPop, Rar, Rsg, Sanbec, Sauron, Sebelk, Sesperanto, Shooke, Spike mandrake, SuperBraulio13, Tano4595, Toxickore, Triku, Tucapl, Turbo, Vitamine, Yurik, Zanaqo, conversion script, 105 ediciones annimas

Fuentes de imagen, Licencias y contribuyentes


Archivo:Commons-logo.svg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Commons-logo.svg Licencia: logo Contribuyentes: SVG version was created by User:Grunt and cleaned up by 3247, based on the earlier PNG version, created by Reidab. Archivo:Wikibooks-logo.svg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Wikibooks-logo.svg Licencia: logo Contribuyentes: User:Bastique, User:Ramac et al.

Licencia
Creative Commons Attribution-Share Alike 3.0 Unported //creativecommons.org/licenses/by-sa/3.0/

You might also like