lo que traerá. Y también planes para lo que será Perl v5.18.
Uno de los cambios más importantes que han ocurrido en Perl, en estos
últimos meses, es la posibilidad de extender las capacidades del núcleo de
perl. Esto comenzó con Perl v5.12 y continúa desde entonces. Muchas de las
API internas se han limpiado y documentado. Ahora es mucho más fácil
escribir extensiones que trabajen como las funciones incorporadas de Perl,
e incluso extender la sintaxis. Las extensiones pueden modificar el árbol
de operadores mientras Perl compila el código.
Como ejemplo tenemos el operador de Coincidencia Inteligente (Smart
Match) que fue introducido en Perl v5.10. Además del operador "~~" se
introdujeron "given" y "when".
Pero, una vez publicado v5.10, se vio que el comportamiento del operador
"~~" era muy complicado (su comportamiento depende del tipo de cada
operando, y según ese tipo de operando esté a la derecha o a la izquierda).
Entonces Jesse Luehrs publicó el módulo smartmatch::engine::core, que
permite alterar el comportamiento del operador "~~" en cada ámbito léxico.
Si decimos "use smartmatch 'core'" en nuestro código, el operador se
comporta como en v5.10, mientras que si ponemos "use smartmatch 'sane'"
obtenemos un comportamiento diferente.
Este módulo hace uso de la capacidad de ampliación de la sintaxis del
intérprete por parte de extensiones.
Esta capacidad de ampliar las capacidades internas permite, también,
ofrecer nuevas características a los módulos de CPAN. El módulo
List::Gather
de Florian Ragwitz añade las palabras reservadas "gather" y "take", que
se compilan dentro del programa ya analizado. Esta sintaxis ofrece una
forma limpia de crear un array a partir de la iteración de un operador:
Using perl Syntax Highlighting
- use List::Gather;
- my @list = gather {
- while (<$fh>) {
- next if /^\s*$/;
- next if /^\s*#/;
- last if /^(?:__END__|__DATA__)$/;
- take $_ if some_predicate($_);
- }
- take @defaults unless gathered;
- };
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Y esto se puede incluir como una funcionalidad incorporada sin tener que
alterar el intérprete: basta con hacer que el intérprete cargue el módulo
de forma automática, sin intervención del programador.
Qué hay de nuevo en Perl v5.16
No hay nuevas y grandes características, pero trae una colección de algunas
pequeñas mejoras y errores arreglados que harán a Perl 5 mejor. Ahora, en Perl
v5.16 tenemos un token __SUB__. Este token devuelve una referencia a
la subrutina actual, permitiéndonos escribir clausuras recursivas de forma
más limpia:
Using perl Syntax Highlighting
- use feature 'current_sub';
- my $factorial = sub {
- my $val = shift;
- if ( $val > 1 ) {
- return $val * __SUB__->( $val - 1 );
- }
- else {
- return $val;
- }
- };
- print $factorial->(5);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
También trae soporte para Unicode 6.1, además de otras mejoras para
Unicode. Hay mejor soporte para los caracteres Unicode en los nombres de
los símbolos (paquetes, métodos, etc).
El nuevo operador fc y la secuencia de escape \F implementan
la operación "plegado de caja", que hace un plegado de caja limpio para
todos los lenguajes.
Además de lo comentado antes sobre la extensibilidad del intérprete, v5.16
documenta una serie de funciones para manipular "pads". Un
pad es la estructura de datos que almacena variables léxicas en cada
subrutina. Esto ya existía en algunos módulos, como en List::Gather, pero
al documentarlo, se demuestra su estabilidad, y el resto de programadores
podrán confiar en esta API.
Hay un montón de trabajo en la documentación principal. Perl v5.16 trae una
nueva guía de programación orientada a objetos, y la documentación de
referencia orientada a objetos ha sido reescrita desde cero, y ampliada.
Además de estos cambios, se han corregido errores, se ha mejorado la
prestación (velocidad), mejoras en la documentación, y actualizaciones en
los módulos principales.
Una vuelta por el ecosistema Perl 5
Si no has estado atento a las novedades de Perl durante estos años, no
habrás oído hablar de Moose. Moose toma ideas de Common Lisp Object System, Perl 6, y muchos otros
lenguajes. Ofrece una API declarativa limpia para la declaración de
clases y roles. Esto ahorra mucho código complicado que el sistema de
objetos nativo de Perl requería, permitiendo a los desarrolladores
focalizarse en lo que hace la clase en lugar de cómo lo hace. Moose
también ofrece un meta-modelo autocontenido, que significa que puede ser
expandido escribiendo clases y roles usando el propio Moose.
Moose ha sido adoptado por muchos desarrolladores de CPAN, para sus
módulos, y existen docenas de extensiones Moose disponibles.
Perl 5 tiene un excelente número de entornos de trabajo web. Catalyst,
Dancer y Mojolicious son maduros, bien soportados, y ampliamente usados.
Todos estos entornos de trabajo se construyen siguiendo las
especificaciones PSGI, y con las herramientas Plack. Éstas, están
inspiradas por el WSGI de Python y las herramientas Rack de Ruby. Cualquier
aplicación o entorno de trabajo que implemente la especificación PSGI puede
ser fácilmente desplegada usando FastCGI, servidores aislados como Starman,
mod_perl, o incluso con el viejo CGI. Esto hace que escribir y desplegar
aplicaciones web en Perl sea más sencillo que nunca.
Perl también tiene un número de módulos ORM (Object Relational Mapping -
Mapeo objeto-relacional), pero el más popular es DBIx::Class. Ha estado bajo
desarrollo desde 2005, y ha sido ampliamente adoptado por la comunidad,
atrayendo a desarrolladores importantes, así como inspirar la creación de
docenas de extensiones.
Los servicios construidos alrededor del archivo CPAN son emocionantes. La
API MetaCPAN provee de una API web para atacar la base de datos de cada
distribución subida a CPAN. Esta API es abierta y de uso libre, por lo que
cualquiera puede construir herramientas con ella. Realmente ya existe un
nuevo motor de búsqueda CPAN, llamado también MetaCPAN, que usa esta API.
El servicio CPAN Testers colecciona los informes de test de cada
distribución subida a CPAN. Los voluntarios comprueban las distribuciones
en muchas y diferentes plataformas y versiones de Perl. El servicio recibió
el informe veinte millones el 7 de marzo de 2012; y actualmente está
recibiendo cerca de un millón de informes al mes.
La comunidad también está muy ocupada organizando eventos. Están los YAPC
(Yet Another Perl Conference) de este verano en los EEUU, Alemania, Brasil y Japón, así como
un montón de pequeños talleres, a lo largo del año.
Calendario de grandes eventos. Calendario de eventos menores (Perl Mongers, grupos de usuarios).
Planes futuros para Perl 5
Hay algunas ideas para lo que será Perl en sus próximas versiones.
Hay un proyecto para poner un MOP en el núcleo de Perl 5. Un MOP es un
Protocolo de Meta Objetos. Moose ofrece uno, pero lo hace como una
extensión. El objetivo es crear una API que pueda ser implementada por el
núcleo de Perl 5 y extendida por módulos como Moose. Poniendo esto en el
núcleo tiene el potencial de hacer a los módulos como Moose mucho más
rápidos. Sin embargo, MOP no es solo para Moose. Será lo suficientemente
flexible como para soportar múltiples sistemas de objetos, y será usable
como un sistema propio orientado a objetos, sin extensión.
Además, esto incluirá un pequeño cambio de sintaxis. En particular, clases
y métodos, finalmente, se distinguirán de los paquetes y subrutinas, y
habrá un soporte básico para los roles, parámetros nominales en los
métodos, y declaración de atributos.
El trabajo en Unicode sigue progresando. v5.18 incluirá (esperemos) soporte
para las operaciones de conjunto en las clases carácter Unicode, en las
expresiones regulares, así como mejoras de prestaciones en todo lo
relacionado con Unicode.
Mientras que es difícil de predecir con exactitud el futuro, es emocionante
ver la actividad y esfuerzo que lleva el desarrollo del núcleo de Perl 5,
estos días. El nuevo calendario de lanzamientos, junto con el uso de Git,
parece que han atraído a nuevos contribuyentes. Mirando en la actividad del
núcleo y en la comunidad, Perl 5 sigue una saludable senda hacia el futuro.
Dave Rolsky.
Artículo original (en inglés)