Perl

Ajustar Compartir Imprimir Citar
Interpreted programming language first released in 1987

Perl es una familia de dos lenguajes de programación dinámicos, interpretados, de propósito general y de alto nivel. "Perl" se refiere a Perl 5, pero de 2000 a 2019 también se refirió a su 'lenguaje hermano' rediseñado, Perl 6, antes de que el nombre de este último se cambiara oficialmente a Raku en octubre de 2019.

Aunque Perl no es oficialmente un acrónimo, existen varios acrónimos en uso, incluido "Lenguaje práctico de extracción e informes". Perl fue desarrollado por Larry Wall en 1987 como un lenguaje de secuencias de comandos de Unix de propósito general para facilitar el procesamiento de informes. Desde entonces, ha sufrido muchos cambios y revisiones. Raku, que comenzó como un rediseño de Perl 5 en el año 2000, finalmente se convirtió en un lenguaje independiente. Ambos lenguajes continúan siendo desarrollados de forma independiente por diferentes equipos de desarrollo y toman prestadas generosamente ideas entre sí.

Los lenguajes Perl toman prestadas funciones de otros lenguajes de programación, incluidos C, sh, AWK y sed; Proporcionan facilidades de procesamiento de texto sin los límites de longitud de datos arbitrarios de muchas herramientas de línea de comandos contemporáneas de Unix. Perl 5 ganó gran popularidad a fines de la década de 1990 como un lenguaje de secuencias de comandos CGI, en parte debido a sus poderosas capacidades de expresión regular y análisis de cadenas.

Además de CGI, Perl 5 se usa para administración de sistemas, programación de redes, finanzas, bioinformática y otras aplicaciones, como GUI. Ha sido apodado "la motosierra del ejército suizo de los lenguajes de secuencias de comandos" por su flexibilidad y poder, y también por lo que algunos consideran feo debido a su utilización de más caracteres especiales que muchos otros idiomas. En 1998, también se la denominó "cinta adhesiva que mantiene unida a Internet" en referencia tanto a su uso ubicuo como lenguaje adhesivo como a su falta de elegancia percibida.

Perl es un lenguaje de programación muy expresivo: el código fuente de un algoritmo dado puede ser corto y muy comprimible.

Nombre

Perl originalmente se llamaba "Pearl". Wall quería darle al idioma un nombre corto con connotaciones positivas. Wall descubrió el lenguaje de programación PEARL existente antes del lanzamiento oficial de Perl y cambió la ortografía del nombre.

Cuando se refiere al idioma, el nombre está en mayúscula: Perl. Cuando se hace referencia al programa en sí, el nombre no está en mayúsculas (perl) porque la mayoría de los sistemas de archivos similares a Unix distinguen entre mayúsculas y minúsculas. Antes del lanzamiento de la primera edición de Programming Perl, era común referirse al lenguaje como perl. Randal L. Schwartz, sin embargo, puso en mayúsculas el nombre del idioma en el libro para que se destaque mejor cuando se escribe. Esta distinción de casos se documentó posteriormente como canónica.

El nombre se expande ocasionalmente como un acrónimo: Practical Extraction and Report Language y el propio Wall's Pathologically Eclectic Rubbish Lister que se encuentra en la página del manual de perl.

Historia

Versiones anteriores

Larry Wall comenzó a trabajar en Perl en 1987, mientras trabajaba como programador en Unisys, y la versión 1.0 el 18 de diciembre de 1987. El lenguaje se expandió rápidamente en los años siguientes.

Perl 2, lanzado en 1988, presentaba un mejor motor de expresiones regulares. Perl 3, lanzado en 1989, agregó soporte para flujos de datos binarios.

Originalmente, la única documentación para Perl era una sola página man larga. En 1991, Programming Perl, conocido por muchos programadores de Perl como el "Camel Book" por su portada, se publicó y se convirtió en la referencia de facto del idioma. Al mismo tiempo, el número de versión de Perl se elevó a 4, no para marcar un cambio importante en el idioma, sino para identificar la versión que estaba bien documentada en el libro.

Primeros Perl 5

Perl 4 pasó por una serie de versiones de mantenimiento, que culminaron en Perl 4.036 en 1993, después de lo cual Wall abandonó Perl 4 para comenzar a trabajar en Perl 5. El diseño inicial de Perl 5 continuó hasta 1994. Los perl5-porters la lista de correo se estableció en mayo de 1994 para coordinar el trabajo de migración de Perl 5 a diferentes plataformas. Sigue siendo el foro principal para el desarrollo, mantenimiento y portabilidad de Perl 5.

Perl 5.000 se lanzó el 17 de octubre de 1994. Fue una reescritura casi completa del intérprete y agregó muchas características nuevas al lenguaje, incluidos objetos, referencias, variables léxicas (my) y módulos. Es importante destacar que los módulos proporcionaron un mecanismo para extender el lenguaje sin modificar el intérprete. Esto permitió que el intérprete principal se estabilizara, al tiempo que permitía a los programadores ordinarios de Perl agregar nuevas funciones de lenguaje. Perl 5 ha estado en desarrollo activo desde entonces.

Perl 5.001 se lanzó el 13 de marzo de 1995. Perl 5.002 se lanzó el 29 de febrero de 1996 con la función de nuevos prototipos. Esto permitió a los autores de módulos crear subrutinas que se comportaban como elementos integrados de Perl. Perl 5.003 se publicó el 25 de junio de 1996 como versión de seguridad.

Uno de los eventos más importantes en la historia de Perl 5 tuvo lugar fuera del lenguaje propiamente dicho y fue consecuencia de su compatibilidad con módulos. El 26 de octubre de 1995, se estableció Comprehensive Perl Archive Network (CPAN) como depósito para el lenguaje Perl y los módulos Perl; a diciembre de 2022, cuenta con más de 211 850 módulos en 43 865 distribuciones, escritos por más de 14 324 autores y se refleja en todo el mundo en más de 245 ubicaciones.

Perl 5.004 se lanzó el 15 de mayo de 1997 e incluía, entre otras cosas, el paquete UNIVERSAL, lo que proporcionaba a Perl un objeto base del que se derivaban automáticamente todas las clases y la capacidad de requerir versiones de módulos. Otro desarrollo importante fue la inclusión del módulo CGI.pm, que contribuyó a la popularidad de Perl como lenguaje de secuencias de comandos CGI.

Perl 5.004 agregó soporte para Microsoft Windows, Plan 9, QNX y AmigaOS.

Perl 5.005 se lanzó el 22 de julio de 1998. Esta versión incluía varias mejoras en el motor de expresiones regulares, nuevos enlaces en el backend a través de los módulos B::*, el qr// operador de comillas de expresiones regulares, una gran selección de otros módulos principales nuevos y soporte adicional para varios sistemas operativos más, incluido BeOS.

2000–2020

Versión principal Última actualización
Versión antigua, ya no se mantiene: 5.4 1999-04-29
Versión antigua, ya no se mantiene: 5,5 2004-02-23
Versión antigua, ya no se mantiene: 5.6 2003-11-15
Versión antigua, ya no se mantiene: 5.8 2008-12-14
Versión antigua, ya no se mantiene: 5.10 2009-08-22
Versión antigua, ya no se mantiene: 5.12 2012-11-10
Versión antigua, ya no se mantiene: 5.14 2013-03-10
Versión antigua, ya no se mantiene: 5.16 2013-03-11
Versión antigua, ya no se mantiene: 5.18 2014-10-01
Versión antigua, ya no se mantiene: 5.20 2015-09-12
Versión antigua, ya no se mantiene: 5.22 2017-07-15
Versión antigua, ya no se mantiene: 5.24 2018-04-14
Versión antigua, ya no se mantiene: 5.26 2018-11-29
Versión antigua, ya no se mantiene: 5.28 2020-06-01
Versión antigua, ya no se mantiene: 5.30 2020-06-01
Versión antigua, ya no se mantiene: 5.32 2021-01-23
Versión más antigua, sin embargo, mantenida: 5.34 2022-03-13
Versión estable actual: 5.362022-05-28
Última versión preliminar de una futura versión: 5.37 2022-10-20
Future release: 7.0 ¿2023?
Leyenda:
Versión antigua
Versión más antigua, todavía mantenida
Versión estable actual
Última versión de vista previa
Liberación del futuro

Perl 5.6 se lanzó el 22 de marzo de 2000. Los principales cambios incluyeron compatibilidad con 64 bits, representación de cadenas Unicode, compatibilidad con archivos de más de 2 GiB y el "nuestro" palabra clave. Al desarrollar Perl 5.6, se tomó la decisión de cambiar el esquema de versiones a uno más similar a otros proyectos de código abierto; después de 5.005_63, la siguiente versión se convirtió en 5.5.640, con planes para que las versiones de desarrollo tengan números impares y las versiones estables tengan números pares.

En 2000, Wall hizo un llamado a la comunidad para que sugiriera una nueva versión de Perl. El proceso dio como resultado 361 documentos RFC (solicitud de comentarios) que se utilizarían para guiar el desarrollo de Perl 6. En 2001, se comenzó a trabajar en el "Apocalipsis" para Perl 6, una serie de documentos destinados a resumir las solicitudes de cambio y presentar el diseño de la próxima generación de Perl. Se presentaron como un resumen de los RFC, en lugar de un documento formal. En este punto, Perl 6 existía solo como descripción de un lenguaje.

Perl 5.8 se lanzó por primera vez el 18 de julio de 2002 y, desde entonces, ha tenido actualizaciones casi anuales. Perl 5.8 mejoró la compatibilidad con Unicode, agregó una nueva implementación de E/S, agregó una nueva implementación de subprocesos, mejoró la precisión numérica y agregó varios módulos nuevos. A partir de 2013, esta versión sigue siendo la versión más popular de Perl y la utilizan Red Hat 5, Suse 10, Solaris 10, HP-UX 11.31 y AIX 5.

En 2004, se comenzó a trabajar en las "Sinopsis" – documentos que originalmente resumían el Apocalipsis, pero que se convirtieron en la especificación para el lenguaje Perl 6. En febrero de 2005, Audrey Tang comenzó a trabajar en Pugs, un intérprete de Perl 6 escrito en Haskell. Este fue el primer esfuerzo concertado para hacer realidad Perl 6. Este esfuerzo se estancó en 2006.

PONIE es un acrónimo de Perl On New Internal Engine. El Proyecto PONIE existió desde 2003 hasta 2006 e iba a ser un puente entre Perl 5 y Perl 6. Fue un esfuerzo por reescribir el intérprete de Perl 5 para ejecutarlo en Parrot, la máquina virtual de Perl 6. El objetivo era asegurar el futuro de los millones de líneas de código de Perl 5 en miles de empresas de todo el mundo. El proyecto PONIE finalizó en 2006 y ya no se desarrolla activamente. Algunas de las mejoras realizadas al intérprete de Perl 5 como parte de PONIE se incluyeron en ese proyecto.

El 18 de diciembre de 2007, el vigésimo aniversario de Perl 1.0, se lanzó Perl 5.10.0. Perl 5.10.0 incluyó nuevas características notables, que lo acercaron a Perl 6. Estas incluyeron una declaración de cambio (llamada "dado"/"cuándo"), actualizaciones de expresiones regulares y operador de coincidencia inteligente (~~). Casi al mismo tiempo, comenzó el desarrollo serio de otra implementación de Perl 6 conocida como Rakudo Perl, desarrollada en conjunto con la máquina virtual Parrot. Desde noviembre de 2009, Rakudo Perl ha tenido lanzamientos mensuales regulares y ahora es la implementación más completa de Perl 6.

Se produjo un cambio importante en el proceso de desarrollo de Perl 5 con Perl 5.11; la comunidad de desarrollo ha cambiado a un ciclo de lanzamiento mensual de lanzamientos de desarrollo, con un calendario anual de lanzamientos estables. Según ese plan, los lanzamientos puntuales de corrección de errores seguirán a los lanzamientos estables cada tres meses.

El 12 de abril de 2010, se lanzó Perl 5.12.0. Las mejoras principales notables incluyen la nueva sintaxis package NAME VERSION, el operador Yada Yada (destinado a marcar el código de marcador de posición que aún no se implementó), restricciones implícitas, cumplimiento total de Y2038, sobrecarga de conversión de expresiones regulares, compatibilidad con DTrace y Unicode 5.2.

El 14 de mayo de 2011, se lanzó Perl 5.14 con compatibilidad con JSON integrada.

El 20 de mayo de 2012, se lanzó Perl 5.16. Las nuevas características notables incluyen la capacidad de especificar una versión determinada de Perl que uno desea emular, lo que permite a los usuarios actualizar su versión de Perl, pero aún ejecutar scripts antiguos que normalmente serían incompatibles. Perl 5.16 también actualiza el núcleo para admitir Unicode 6.1.

El 18 de mayo de 2013, se lanzó Perl 5.18. Las nuevas características notables incluyen los nuevos ganchos dtrace, subs léxicos, más CORE:: subs, revisión del hash por razones de seguridad, soporte para Unicode 6.2.

El 27 de mayo de 2014, se lanzó Perl 5.20. Las nuevas características notables incluyen firmas de subrutinas, segmentos de hash/sintaxis de nuevos segmentos, desreferenciación de postfijos (experimental), Unicode 6.3, rand() usando un generador de números aleatorios consistente.

Algunos observadores atribuyen el lanzamiento de Perl 5.10 al inicio del movimiento Modern Perl. En particular, esta frase describe un estilo de desarrollo que adopta el uso de CPAN, aprovecha los desarrollos recientes en el lenguaje y es riguroso en la creación de código de alta calidad. Mientras que el libro "Modern Perl" puede ser el abanderado más visible de esta idea, otros grupos como la Enlightened Perl Organization se han sumado a la causa.

A finales de 2012 y 2013, comenzaron varios proyectos de implementaciones alternativas para Perl 5: Perl5 en Perl6 por el equipo de Rakudo Perl, moe por Stevan Little y amigos, p2 por el equipo de Perl11 bajo Reini Urban, gperl por goccy, y rperl, un proyecto de Kickstarter dirigido por Will Braswell y afiliado al proyecto Perll11.

2020 en adelante

En junio de 2020, se anunció Perl 7 como el sucesor de Perl 5. Inicialmente, Perl 7 se basaría en Perl 5.32 con un lanzamiento previsto para la primera mitad de 2021 y lanzamiento de candidatos antes. Este plan se revisó en mayo de 2021 y no se especificó ningún plazo de lanzamiento ni versión de Perl 5 para su uso como referencia. Cuando se lance Perl 7, Perl 5 entrará en mantenimiento a largo plazo. Sin embargo, las versiones compatibles de Perl 5 seguirán obteniendo importantes correcciones de seguridad y errores.

Símbolos

Camello

El símbolo Camel utilizado por O'Reilly Media

Programming Perl, publicado por O'Reilly Media, presenta una imagen de un camello dromedario en la portada y comúnmente se le llama "Camel Book". Esta imagen se ha convertido en un símbolo no oficial de Perl, así como en un emblema general de piratas informáticos, que aparece en camisetas y otras prendas de vestir.

O'Reilly posee la imagen como marca comercial pero la licencia para uso no comercial, requiriendo solo un reconocimiento y un enlace a www.perl.com. La concesión de licencias para uso comercial se decide caso por caso. O'Reilly también ofrece "Programming Republic of Perl" logotipos para sitios no comerciales y "Powered by Perl" botones para cualquier sitio que use Perl.

Cebolla

El logo de cebolla utilizado por la Fundación Perl

La Perl Foundation posee un símbolo alternativo, una cebolla, que otorga bajo licencia a sus subsidiarias, Perl Mongers, PerlMonks, Perl.org y otras. El símbolo es un juego de palabras visual con cebolla perla.

Ave de rapiña

Logo Perl 5 alternativo

Sebastian Riedel, el creador de Mojolicious, creó un logotipo que representa un dinosaurio rapaz, que está disponible bajo una licencia CC-SA, versión 4.0. El análogo del raptor proviene de una serie de charlas impartidas por Matt S Trout a partir de 2010.

Resumen

Según Wall, Perl tiene dos lemas. La primera es "Hay más de una forma de hacerlo" comúnmente conocido como TMTOWTDI. El segundo eslogan es "Las cosas fáciles deberían ser fáciles y las cosas difíciles deberían ser posibles".

Características

La estructura general de Perl se deriva ampliamente de C. Perl es de naturaleza procedimental, con variables, expresiones, instrucciones de asignación, bloques delimitados por llaves, estructuras de control y subrutinas.

Perl también toma características de la programación de shell. Todas las variables están marcadas con sigilos iniciales, lo que permite interpolar variables directamente en cadenas. Sin embargo, a diferencia del shell, Perl usa sigilos en todos los accesos a las variables y, a diferencia de la mayoría de los otros lenguajes de programación que usan sigilos, el sigilo no denota el tipo de variable sino el tipo de expresión. Entonces, por ejemplo, mientras que una matriz se denota con el sigilo "@" (por ejemplo, @arrayname), un miembro individual de la matriz se indica mediante el sigilo escalar "$" (por ejemplo, $arrayname[3]). Perl también tiene muchas funciones integradas que brindan herramientas que se usan a menudo en la programación de shell (aunque muchas de estas herramientas son implementadas por programas externos al shell), como ordenar y llamar a las instalaciones del sistema operativo.

Perl toma hashes ("matrices asociativas") de AWK y expresiones regulares de sed. Estos simplifican muchas tareas de análisis, manejo de texto y administración de datos. Compartido con Lisp está el retorno implícito del último valor en un bloque, y todas las declaraciones también son expresiones que pueden usarse en expresiones más grandes.

Perl 5 agregó funciones que admiten estructuras de datos complejas, funciones de primera clase (es decir, cierres como valores) y un modelo de programación orientado a objetos. Estos incluyen referencias, paquetes, envío de métodos basados en clases y variables de ámbito léxico, junto con directivas del compilador (por ejemplo, el pragma strict). Una característica adicional importante introducida con Perl 5 fue la capacidad de empaquetar el código como módulos reutilizables. Más tarde, Wall afirmó que "toda la intención del sistema de módulos de Perl 5 era fomentar el crecimiento de la cultura Perl en lugar del núcleo de Perl".

Todas las versiones de Perl realizan escritura automática de datos y administración automática de memoria. El intérprete conoce el tipo y los requisitos de almacenamiento de cada objeto de datos en el programa; asigna y libera almacenamiento para ellos según sea necesario mediante el recuento de referencias (por lo que no puede desasignar estructuras de datos circulares sin intervención manual). Las conversiones de tipo legal, por ejemplo, las conversiones de número a cadena, se realizan automáticamente en tiempo de ejecución; las conversiones de tipos ilegales son errores fatales.

Diseño

El diseño de Perl puede entenderse como una respuesta a tres grandes tendencias en la industria informática: la caída de los costos de hardware, el aumento de los costos de mano de obra y las mejoras en la tecnología de compilación. Muchos lenguajes informáticos anteriores, como Fortran y C, tenían como objetivo hacer un uso eficiente del costoso hardware informático. Por el contrario, Perl fue diseñado para que los programadores de computadoras pudieran escribir programas más rápida y fácilmente.

Perl tiene muchas funciones que facilitan la tarea del programador a expensas de mayores requisitos de CPU y memoria. Estos incluyen la gestión automática de la memoria; escritura dinámica; cadenas, listas y hashes; expresiones regulares; introspección; y una función eval(). Perl sigue la teoría de "sin límites incorporados" una idea similar a la regla Zero One Infinity.

Wall se formó como lingüista y el diseño de Perl se basa en gran medida en principios lingüísticos. Los ejemplos incluyen la codificación Huffman (las construcciones comunes deben ser cortas), una buena ponderación final (la información importante debe ir primero) y una gran colección de lenguajes primitivos. Perl favorece las construcciones de lenguaje que son concisas y naturales para que los humanos las escriban, incluso cuando complican al intérprete de Perl.

La sintaxis de Perl refleja la idea de que "las cosas que son diferentes deben verse diferentes." Por ejemplo, los escalares, matrices y hashes tienen diferentes sigilos principales. Los índices de matriz y las claves hash utilizan diferentes tipos de llaves. Las cadenas y las expresiones regulares tienen diferentes delimitadores estándar. Este enfoque se puede contrastar con un lenguaje como Lisp, donde se utiliza la misma sintaxis básica, compuesta de expresiones simbólicas simples y universales, para todos los propósitos.

Perl no impone ningún paradigma de programación en particular (procedimiento, orientado a objetos, funcional u otros) ni requiere que el programador elija entre ellos.

Existe una amplia tendencia práctica tanto en el lenguaje Perl como en la comunidad y la cultura que lo rodean. El prefacio de Programación de Perl comienza así: "Perl es un lenguaje para hacer su trabajo." Una consecuencia de esto es que Perl no es un lenguaje ordenado. Incluye muchas características, tolera excepciones a sus reglas y emplea heurísticas para resolver ambigüedades sintácticas. Debido a la naturaleza indulgente del compilador, a veces puede ser difícil encontrar errores. La documentación de funciones de Perl comenta sobre el comportamiento variable de las funciones integradas en contextos escalares y de lista al decir: "En general, hacen lo que usted quiere, a menos que desee consistencia".

No existe ninguna especificación escrita o estándar para el lenguaje Perl para las versiones de Perl hasta Perl 5, y no hay planes para crear una para la versión actual de Perl. Solo ha habido una implementación del intérprete, y el lenguaje ha evolucionado junto con ella. Ese intérprete, junto con sus pruebas funcionales, se erige como una especificación de facto del lenguaje. Sin embargo, Perl 6 comenzó con una especificación y varios proyectos tienen como objetivo implementar parte o la totalidad de la especificación.

Aplicaciones

Perl tiene muchas y variadas aplicaciones, además de la disponibilidad de muchos módulos estándar y de terceros.

Perl se ha utilizado principalmente para escribir secuencias de comandos CGI: los grandes proyectos escritos en Perl incluyen cPanel, Slash, Bugzilla, RT, TWiki y Movable Type; Los sitios web de alto tráfico que usan Perl ampliamente incluyen Priceline.com, Craigslist, IMDb, LiveJournal, DuckDuckGo, Slashdot y Ticketmaster. También es un componente opcional de la popular pila de tecnología LAMP para el desarrollo web, en lugar de PHP o Python. Perl se usa ampliamente como lenguaje de programación del sistema en la distribución Debian Linux.

Perl se usa a menudo como lenguaje de unión, uniendo sistemas e interfaces que no fueron diseñados específicamente para interoperar y para "transferencia de datos" es decir, convertir o procesar grandes cantidades de datos para tareas como la creación de informes. De hecho, estas fortalezas están íntimamente ligadas. La combinación hace de Perl un popular lenguaje multiusos para los administradores de sistemas, particularmente porque los programas cortos, a menudo llamados "programas de una sola línea" se puede ingresar y ejecutar en una sola línea de comando.

El código Perl se puede hacer portátil en Windows y Unix; los proveedores de software (tanto COTS como a medida) suelen utilizar dicho código para simplificar el empaquetado y el mantenimiento de los scripts de creación e implementación de software.

Perl/Tk y wxPerl se usan comúnmente para agregar interfaces gráficas de usuario a los scripts de Perl.

Implementación

Perl se implementa como un intérprete central, escrito en C, junto con una gran colección de módulos, escritos en Perl y C. A partir de 2010, el intérprete consta de 150 000 líneas de código C y se compila en un ejecutable de 1 MB en arquitecturas de máquinas. Alternativamente, el intérprete puede compilarse en una biblioteca de enlaces e integrarse en otros programas. Hay casi 500 módulos en la distribución, que comprenden 200 000 líneas de Perl y 350 000 líneas adicionales de código C (gran parte del código C en los módulos consiste en tablas de codificación de caracteres).

El intérprete tiene una arquitectura orientada a objetos. Todos los elementos del lenguaje Perl (escalares, matrices, hash, coderefs, identificadores de archivos) están representados en el intérprete por estructuras C. Las operaciones en estas estructuras están definidas por una gran colección de macros, typedefs y funciones; estos constituyen la API de Perl C. La API de Perl puede resultar desconcertante para los no iniciados, pero sus puntos de entrada siguen un esquema de nomenclatura coherente, que brinda orientación a quienes la utilizan.

La vida de un intérprete de Perl se divide en términos generales en una fase de compilación y una fase de ejecución. En Perl, las fases son las principales etapas del ciclo de vida del intérprete. Cada intérprete pasa por cada fase solo una vez, y las fases siguen una secuencia fija.

La mayor parte de lo que sucede en la fase de compilación de Perl es compilación, y la mayor parte de lo que sucede en la fase de ejecución de Perl es ejecución, pero hay excepciones importantes. Perl hace un uso importante de su capacidad para ejecutar código Perl durante la fase de compilación. Perl también retrasará la compilación hasta la fase de ejecución. Los términos que indican el tipo de procesamiento que se está produciendo realmente en cada momento son tiempo de compilación y tiempo de ejecución. Perl está en tiempo de compilación en la mayoría de los puntos durante la fase de compilación, pero también se puede ingresar el tiempo de compilación durante la fase de ejecución. El tiempo de compilación para el código en un argumento de cadena pasado al eval incorporado ocurre durante la fase de ejecución. Perl suele estar en tiempo de ejecución durante la fase de compilación y pasa la mayor parte de la fase de ejecución en tiempo de ejecución. El código en los bloques BEGIN se ejecuta en tiempo de ejecución pero en la fase de compilación.

En tiempo de compilación, el intérprete analiza el código Perl en un árbol de sintaxis. En tiempo de ejecución, ejecuta el programa recorriendo el árbol. El texto se analiza solo una vez y el árbol de sintaxis está sujeto a optimización antes de ejecutarse, por lo que la ejecución es relativamente eficiente. Las optimizaciones de tiempo de compilación en el árbol de sintaxis incluyen el plegado constante y la propagación del contexto, pero también se realiza la optimización de mirilla.

Perl tiene una gramática completa de Turing porque el análisis puede verse afectado por el código de tiempo de ejecución ejecutado durante la fase de compilación. Por lo tanto, Perl no puede ser analizado por una combinación directa de Lex/Yacc lexer/parser. En su lugar, el intérprete implementa su propio lexer, que se coordina con un analizador bisonte GNU modificado para resolver ambigüedades en el lenguaje.

A menudo se dice que "Solo Perl puede analizar Perl," lo que significa que solo el intérprete de Perl (perl) puede analizar el lenguaje Perl (Perl), pero incluso esto, en general, no es cierto. Debido a que el intérprete de Perl puede simular una máquina de Turing durante su fase de compilación, necesitaría decidir el problema de detención para completar el análisis en todos los casos. Es un resultado de larga data que el problema de la detención es indecidible y, por lo tanto, ni siquiera Perl siempre puede analizar Perl. Perl toma la decisión inusual de dar al usuario acceso a todo su poder de programación en su propia fase de compilación. El costo en términos de pureza teórica es alto, pero los inconvenientes prácticos parecen ser raros.

Otros programas que realizan el análisis de Perl, como los analizadores de código fuente y los auto-indenters, tienen que lidiar no solo con construcciones sintácticas ambiguas, sino también con la indecidibilidad del análisis de Perl en el caso general. El proyecto PPI de Adam Kennedy se centró en analizar el código Perl como un documento (manteniendo su integridad como documento), en lugar de analizar Perl como código ejecutable (que ni siquiera el mismo Perl siempre puede hacer). Kennedy fue el primero en conjeturar que "el análisis de Perl adolece del 'problema de detención'," que luego se demostró.

Perl se distribuye con más de 250 000 pruebas funcionales para el lenguaje Perl principal y más de 250 000 pruebas funcionales para los módulos principales. Estos se ejecutan como parte del proceso de compilación normal y ejercitan ampliamente el intérprete y sus módulos principales. Los desarrolladores de Perl confían en las pruebas funcionales para garantizar que los cambios en el intérprete no introduzcan errores de software; además, los usuarios de Perl que ven que el intérprete pasa las pruebas funcionales en su sistema pueden tener un alto grado de confianza de que funciona correctamente.

Disponibilidad

Perl tiene licencia dual bajo la Licencia Artística 1.0 y la Licencia Pública General GNU. Las distribuciones están disponibles para la mayoría de los sistemas operativos. Prevalece particularmente en sistemas Unix y similares a Unix, pero ha sido portado a la mayoría de las plataformas modernas (y muchas obsoletas). Con solo seis excepciones informadas, Perl se puede compilar a partir del código fuente en todas las plataformas compatibles con POSIX o compatibles con Unix.

Debido a los cambios inusuales necesarios para el entorno clásico de Mac OS, se envió un puerto especial llamado MacPerl de forma independiente.

Comprehensive Perl Archive Network incluye una lista completa de plataformas compatibles con enlaces a las distribuciones disponibles en cada una. CPAN también es la fuente de los módulos Perl disponibles públicamente que no forman parte de la distribución principal de Perl.

Ventanas

Los usuarios de Microsoft Windows normalmente instalan una de las distribuciones binarias nativas de Perl para Win32, más comúnmente Strawberry Perl o ActivePerl. Es posible compilar Perl a partir del código fuente en Windows, pero la mayoría de las instalaciones carecen del compilador de C y las herramientas de compilación necesarias. Esto también dificulta la instalación de módulos del CPAN, particularmente aquellos que están parcialmente escritos en C.

ActivePerl es una distribución de código cerrado de ActiveState que tiene versiones regulares que rastrean las versiones principales de Perl. La distribución incluía anteriormente el administrador de paquetes Perl (PPM), una herramienta popular para instalar, eliminar, actualizar y administrar el uso de módulos Perl comunes; sin embargo, esta herramienta se suspendió a partir de ActivePerl 5.28. También se incluye PerlScript, un motor Windows Script Host (WSH) que implementa el lenguaje Perl. Visual Perl es una herramienta de ActiveState que agrega Perl a la suite de desarrollo de Visual Studio.NET. Esta empresa también ha producido un convertidor de VBScript a Perl, así como un compilador de Perl para Windows y convertidores de awk y sed a Perl, que se incluyen en el ActiveState CD para Windows, que incluye todas sus distribuciones más el IDE de Komodo y todas menos la primera en la variante Unix/Linux/Posix del mismo en 2002 y posteriormente.

Strawberry Perl es una distribución de código abierto para Windows. Ha tenido lanzamientos trimestrales regulares desde enero de 2008, incluidos nuevos módulos a medida que llegan los comentarios y las solicitudes. Strawberry Perl tiene como objetivo poder instalar módulos como las distribuciones estándar de Perl en otras plataformas, incluida la compilación de módulos XS.

La capa de emulación de Cygwin es otra forma de ejecutar Perl en Windows. Cygwin proporciona un entorno similar a Unix en Windows, y tanto Perl como CPAN están disponibles como paquetes estándar precompilados en el programa de instalación de Cygwin. Dado que Cygwin también incluye gcc, también es posible compilar Perl desde el código fuente.

Se incluye un ejecutable de Perl en varios kits de recursos de Windows en el directorio con otras herramientas de secuencias de comandos.

Las implementaciones de Perl vienen con MKS Toolkit, Interix (la base de implementaciones anteriores de Windows Services para Unix) y UWIN.

Interfaces de bases de datos

Las capacidades de manejo de texto de Perl se pueden usar para generar consultas SQL; las matrices, los hash y la gestión automática de la memoria facilitan la recopilación y el procesamiento de los datos devueltos. Por ejemplo, en la interfaz de programación de aplicaciones (API) Perl DBI de Tim Bunce, los argumentos de la API pueden ser el texto de consultas SQL; por lo tanto, es posible programar en varios idiomas al mismo tiempo (por ejemplo, para generar una página web usando HTML, JavaScript y SQL en un documento aquí). El uso de la interpolación de variables de Perl para personalizar mediante programación cada una de las consultas SQL, y la especificación de matrices o hashes de Perl como estructuras para almacenar mediante programación los conjuntos de datos resultantes de cada consulta SQL, permite un mecanismo de alto nivel para manejar grandes cantidades de datos. para el posprocesamiento por un subprograma de Perl. En las primeras versiones de Perl, las interfaces de la base de datos se creaban volviendo a vincular el intérprete con una biblioteca de base de datos del lado del cliente. Esto fue tan difícil que se hizo solo para algunas de las bases de datos más importantes y más utilizadas, y restringió el ejecutable perl resultante a usar solo una interfaz de base de datos a la vez.

En Perl 5, las interfaces de base de datos se implementan mediante módulos Perl DBI. El módulo DBI (interfaz de base de datos) presenta una única interfaz independiente de la base de datos para las aplicaciones Perl, mientras que los módulos DBD (controlador de base de datos) manejan los detalles de acceso a unas 50 bases de datos diferentes; existen controladores DBD para la mayoría de las bases de datos ANSI SQL.

DBI proporciona almacenamiento en caché para identificadores y consultas de bases de datos, lo que puede mejorar en gran medida el rendimiento en entornos de ejecución de larga duración como mod_perl, lo que ayuda a los sistemas de gran volumen a evitar picos de carga como en el efecto Slashdot.

En las aplicaciones Perl modernas, especialmente aquellas escritas con marcos web como Catalyst, el módulo DBI se usa a menudo indirectamente a través de mapeadores relacionales de objetos como DBIx::Class, Class::DBI o Rose::DB::Object que genere consultas SQL y maneje los datos de manera transparente para el autor de la aplicación.

Rendimiento comparativo

El Computer Language Benchmarks Game compara el rendimiento de las implementaciones de problemas típicos de programación en varios lenguajes de programación. Las implementaciones de Perl presentadas generalmente funcionan hacia el extremo superior del espectro de uso de memoria y brindan resultados de velocidad variados. El rendimiento de Perl en el juego de puntos de referencia es típico de los lenguajes interpretados.

Los programas grandes de Perl se inician más lentamente que los programas similares en lenguajes compilados porque Perl tiene que compilar el código fuente cada vez que se ejecuta. En una charla en la conferencia YAPC::Europa 2005 y el artículo posterior "A Timely Start" Jean-Louis Leroy descubrió que sus programas Perl tardaban mucho más de lo esperado en ejecutarse porque el intérprete de Perl dedicaba mucho tiempo a encontrar módulos dentro de su ruta de inclusión demasiado grande. A diferencia de Java, Python y Ruby, Perl solo tiene soporte experimental para la precompilación. Por lo tanto, los programas Perl pagan esta penalización por gastos generales en cada ejecución. La fase de ejecución de los programas típicos es lo suficientemente larga como para que el tiempo de inicio amortizado no sea sustancial, pero es probable que los puntos de referencia que miden tiempos de ejecución muy cortos estén sesgados debido a esta sobrecarga.

Se han introducido varias herramientas para mejorar esta situación. La primera herramienta de este tipo fue mod_perl de Apache, que buscaba abordar una de las razones más comunes por las que los pequeños programas Perl se invocaban rápidamente: el desarrollo web CGI. ActivePerl, a través de Microsoft ISAPI, proporciona mejoras de rendimiento similares.

Una vez que se compila el código Perl, hay una sobrecarga adicional durante la fase de ejecución que normalmente no está presente para los programas escritos en lenguajes compilados como C o C++. Los ejemplos de dicha sobrecarga incluyen la interpretación del código de bytes, la gestión de la memoria de recuento de referencias y la verificación dinámica de tipos.

Optimización

Las rutinas más críticas se pueden escribir en otros lenguajes (como C), que se pueden conectar a Perl a través de módulos Inline simples o el mecanismo XS más complejo pero flexible.

Perl 5

Perl 5, el lenguaje al que generalmente se hace referencia como "Perl", sigue desarrollándose activamente. Perl 5.12.0 se lanzó en abril de 2010 con algunas características nuevas influenciadas por el diseño de Perl 6, seguido de Perl 5.14.1 (lanzado el 17 de junio de 2011), Perl 5.16.1 (lanzado el 9 de agosto de 2012), y Perl 5.18.0 (lanzado el 18 de mayo de 2013). Las versiones de desarrollo de Perl 5 se publican mensualmente y las versiones principales se publican una vez al año.

La proporción relativa de búsquedas en Internet de "programación en Perl", en comparación con búsquedas similares de otros lenguajes de programación, disminuyó de forma constante desde alrededor del 10 % en 2005 hasta alrededor del 2 % en 2011 y alrededor del 0,7 %. en 2020.

Raku (Perl 6)

Camelia, el logotipo del proyecto Perl 6

En la Conferencia Perl de 2000, Jon Orwant defendió una importante iniciativa de lenguaje nuevo. Esto condujo a la decisión de comenzar a trabajar en un rediseño del lenguaje, que se llamaría Perl 6. Se solicitaron propuestas para nuevas características del lenguaje a la comunidad de Perl en general, que envió más de 300 RFC.

Wall pasó los siguientes años digiriendo los RFC y sintetizándolos en un marco coherente para Perl 6. Presentó su diseño para Perl 6 en una serie de documentos llamados "apocalipsis" – numerados para corresponder a los capítulos en Programación Perl. A partir de enero de 2011, la especificación en desarrollo de Perl 6 se encapsuló en documentos de diseño llamados Sinopsis, numerados para corresponder a Apocalipsis.

El trabajo de tesis de Bradley M. Kuhn, supervisado por Wall, consideró el posible uso de la máquina virtual Java como tiempo de ejecución para Perl. La tesis de Kuhn mostró que este enfoque es problemático. En 2001, se decidió que Perl 6 se ejecutaría en una máquina virtual multilingüe llamada Parrot. Esto significará que otros idiomas dirigidos a Parrot obtendrán acceso nativo a CPAN, lo que permitirá cierto nivel de desarrollo entre idiomas.

En 2005, Audrey Tang creó el proyecto Pugs, una implementación de Perl 6 en Haskell. Esto actuó y continúa actuando como una plataforma de prueba para el lenguaje Perl 6 (separado del desarrollo de la implementación real), lo que permite que los diseñadores del lenguaje exploren. El proyecto Pugs generó una comunidad multilingüe activa de Perl/Haskell centrada en el canal IRC Libera Chat #raku. El equipo de diseño de Perl 6 absorbió muchas influencias de la programación funcional.

En 2012, el desarrollo de Perl 6 se centró principalmente en dos compiladores:

  1. Rakudo, una implementación que se ejecuta en la máquina virtual Parrot y la máquina virtual Java.
  2. Niecza, que apunta al tiempo de ejecución del lenguaje común.

En 2013, se anunció MoarVM ("Metamodelo en tiempo de ejecución"), una máquina virtual basada en lenguaje C diseñada principalmente para Rakudo.

En octubre de 2019, Perl 6 pasó a llamarse Raku.

A partir de 2017, solo la implementación de Rakudo y MoarVM están en desarrollo activo, y se admiten otras máquinas virtuales, como Java Virtual Machine y JavaScript.

Perl 7

Perl 7 se anunció el 24 de junio de 2020 en "The Perl Conference in the Cloud" como sucesor de Perl 5. Basado en Perl 5.32, se planeó que Perl 7 fuera compatible con versiones anteriores del código Perl 5 moderno; El código Perl 5, sin el encabezado repetitivo (pragma) necesita agregar use compat::perl5; para seguir siendo compatible, pero el código moderno puede eliminar parte del repetitivo.

Sin embargo, el plan de pasar a Perl 7 suscitó más discusión y el Comité Directivo de Perl lo canceló para evitar problemas con la compatibilidad con versiones anteriores de scripts que no se escribieron en los pragmas y módulos que se convertirían en los predeterminados en Perl 7. Perl 7 solo saldrá cuando los desarrolladores agreguen suficientes funciones para garantizar una actualización importante.

Comunidad Perl

La cultura y la comunidad de Perl se han desarrollado junto con el propio idioma. Usenet fue el primer lugar público en el que se presentó Perl, pero a lo largo de su evolución, la comunidad de Perl fue moldeada por el crecimiento de la ampliación de los servicios basados en Internet, incluida la introducción de la World Wide Web. La comunidad que rodea a Perl fue, de hecho, el tema del primer 'State of the Onion' de Wall. hablar.

Estado de la Cebolla

State of the Onion es el nombre de los resúmenes anuales estilo discurso principal de Wall sobre el progreso de Perl y su comunidad. Se caracterizan por su humor característico, empleando referencias a la cultura de Perl, la cultura hacker más amplia, el trasfondo lingüístico de Wall, a veces su vida familiar y, en ocasiones, incluso su trasfondo cristiano.

Cada charla se da por primera vez en varias conferencias de Perl y finalmente también se publica en línea.

Pasatiempos Perl

JAPH

En mensajes de correo electrónico, Usenet y tableros de mensajes, "Solo otro hacker de Perl" (JAPH) son una tendencia común, originada por Randal L. Schwartz, uno de los primeros formadores profesionales de Perl. En la jerga de la cultura Perl, los programadores de Perl son conocidos como piratas informáticos de Perl, y de ahí deriva la práctica de escribir programas cortos para imprimir la frase "Simplemente otro pirata informático de Perl". En el espíritu del concepto original, estos programas están moderadamente ofuscados y son lo suficientemente cortos como para caber en la firma de un correo electrónico o mensaje de Usenet. El "canónico" JAPH desarrollado por Schwartz incluye la coma al final, aunque a menudo se omite.

Perla golf

Perl "golf" es el pasatiempo de reducir al mínimo el número de caracteres ("pulsaciones" de teclas) utilizados en un programa Perl, de la misma manera que los jugadores de golf buscan hacer la menor cantidad de tiros posible en una ronda. El primer uso de la frase enfatizó la diferencia entre el código de peatones destinado a enseñar a un recién llegado y los trucos breves que probablemente diviertan a los programadores Perl experimentados, un ejemplo de este último son los JAPH que ya se usaban en las firmas en las publicaciones de Usenet y en otros lugares. Acrobacias similares habían sido un pasatiempo sin nombre en el lenguaje APL en décadas anteriores. El uso de Perl para escribir un programa que realizaba el cifrado RSA provocó un interés generalizado y práctico en este pasatiempo. En años posteriores, el término "código golf" se ha aplicado al pasatiempo en otros idiomas. Se llevó a cabo un Perl Golf Apocalypse en Perl Conference 4.0 en Monterey, California, en julio de 2000.

Ofuscación

Al igual que con C, las competencias de código ofuscado eran un pasatiempo muy conocido a fines de la década de 1990. El concurso Ofuscated Perl fue una competencia organizada por The Perl Journal entre 1996 y 2000 que convirtió en una gran virtud la flexibilidad sintáctica de Perl. Se entregaron premios en categorías como "más poderosos"—programas que hicieron un uso eficiente del espacio—y "mejor firma de cuatro líneas" para programas que caben en cuatro líneas de 76 caracteres al estilo de un bloque de firma de Usenet.

Poesía

La poesía Perl es la práctica de escribir poemas que se pueden compilar como código Perl legal, por ejemplo, la pieza conocida como Black Perl. La poesía Perl es posible gracias a la gran cantidad de palabras en inglés que se utilizan en el idioma Perl. Los nuevos poemas se envían regularmente a la comunidad en PerlMonks.

Perl en IRC

Varios canales de IRC ofrecen soporte para Perl y algunos de sus módulos.

IRC Red Canales
irc.libera.chat #perl #raku
irc.perl.org # Moose #poe #catalyst #dbix-class #perl-help #distzilla #epo #corehackers #sdl #win32 #toolchain #padre #dancer
irc.slashnet.org #perlmonks
irc.oftc.net #perl #debian-perl (packaging Perl modules for Debian)
irc.efnet.net #perlhelp
irc.rizon.net Perl

CPAN Acme

También hay muchos ejemplos de código escrito exclusivamente para entretenimiento en CPAN. Lingua::Romana::Perligata, por ejemplo, permite escribir programas en latín. Tras la ejecución de dicho programa, el módulo traduce su código fuente a Perl normal y lo ejecuta.

La comunidad de Perl ha dejado de lado el "Acme" espacio de nombres para módulos que son divertidos por naturaleza (pero su alcance se ha ampliado para incluir código exploratorio o experimental o cualquier otro módulo que no esté destinado a usarse nunca en producción). Algunos de los módulos de Acme se implementan deliberadamente de manera divertida. Esto incluye Acme::Bleach, uno de los primeros módulos en el espacio de nombres Acme::, que permite que el código fuente del programa sea "blanqueado& #34; (es decir, todos los caracteres reemplazados con espacios en blanco) y aún así funcionan.

Código de ejemplo

En versiones anteriores de Perl, uno escribiría el programa Hello World como:

impresión ¡Hola, Mundo!;

Aquí hay un programa Perl más complejo, que cuenta los segundos a partir de un valor inicial dado:

#/usr/bin/perluso estricto;uso advertencias;# () Quedando, Total );Quedando = Total = cambio()@ARGV);STDOUT-autoflush()1);mientras () Quedando ) {} printf () "Permaneciendo %s/%s r", Quedando--, Total ); dormir 1;}impresión "n";

El intérprete de Perl también se puede utilizar para secuencias de comandos únicas en la línea de comandos. El siguiente ejemplo (como se invoca desde un shell compatible con sh, como Bash) traduce la cadena "Bob" en todos los archivos que terminan en.txt en el directorio actual a "Robert":

$ perl -i.bak -lp -e 's/Bob/Robert/g ' *.txt

Crítica

Perl se conoce como "ruido de línea" y un lenguaje de solo escritura por parte de sus críticos. La primera mención de este tipo se encuentra en la primera edición del libro Learning Perl, un tutorial de Perl 4 escrito por Randal L. Schwartz, en cuyo primer capítulo afirma: "Sí, a veces Perl parece ruido de línea para los no iniciados, pero para el programador experimentado de Perl, parece ruido de línea de suma de verificación con una misión en la vida." También afirmó que la acusación de que Perl es un lenguaje de solo escritura podría evitarse codificando con el "cuidado adecuado". El documento de descripción general de Perl perlintro establece que los nombres de "magic" las variables escalares "parecen signos de puntuación o ruido de línea". Sin embargo, el módulo de inglés ofrece alternativas de inglés largo y corto. El documento perlstyle establece que el ruido de línea en las expresiones regulares podría mitigarse usando el modificador /x para agregar espacios en blanco.

Según las preguntas frecuentes de Perl 6, Perl 6 fue diseñado para mitigar "los sospechosos habituales" que provocan el "ruido de línea" afirmación de los críticos de Perl 5, incluida la eliminación de "la mayoría de las variables de puntuación" y el saneamiento de la sintaxis de expresiones regulares. Las preguntas frecuentes de Perl 6 también establecen que lo que a veces se denomina ruido de línea de Perl es "la sintaxis real del lenguaje" así como los gerundios y las preposiciones son parte del idioma inglés. En una publicación de blog de diciembre de 2012, a pesar de afirmar que "Rakudo Perl 6 ha fallado y seguirá fallando a menos que reciba la supervisión de un adulto", chromatic afirmó que el diseño de Perl 6 tiene un "bueno- gramática definida" así como un "sistema de tipos mejorado, un sistema de objetos unificados con un metamodelo inteligente, metaoperadores y un sistema de contexto más claro que proporciona sutilezas como la pereza generalizada". También afirmó que "Perl 6 tiene una coherencia y una consistencia de las que carece Perl 5".