Perl v5.20.0 representa, aproximadamente, 12 meses de desarrollo desde Perl v5.18.0 y contiene aproximadamente 470 000 líneas de cambios a lo largo de 2900 archivos, por parte de 124 autores.
(Algunas) diferencias con la versión anterior son:
Nuevos módulos
Nuevas plataformas
Android
Perl ahora se puede compilar para Android, tanto de forma nativa como en compilación cruzada, para las tres arquitecturas disponibles (ARM, MIPS y x86), en un amplio rango de versiones.
Bitrig
Se añadió soporte para la compilación en Bitrig, un derivado de OpenBSD.
FreeMiNT
Se añadió soporte para FreeMiNT, un sistema operativo de código libre para el sistema Atari ST y sucesores, basado en el MiNT original oficialmente adoptado por Atari.
Synology
Synology monta cajas NAS con una distribución Linux (DSM) en una CPU barata CPU (como la Marvell Kirkwood mv6282 - ARMv5tel o el Freescale QorIQ P1022 ppc - e500v2), no dirigida a estaciones de trabajo o desarrollo. Se debería poder compilar Perl en estos equipos. Los problemas principales son la disposición no estándar de las herramientas.
Plataformas obsoletas
AT&T 3b1
Se ha eliminado soporte para el 3b1, también conocido como Unix PC de AT&T (y el similar AT&T 7300).
DG/UX
DG/UX era un Unix vendido por Data General. El último lanzamiento fue en abril de 2001. Solo funciona en el propio hardware de Data General.
EBCDIC
En ausencia de más informes de compilación exitosa, el código para soportar plataformas EBCDIC será eliminado antes de 5.22.0.
Mejoras
- (experimental) firmas en subrutinas
Sintaxis declarativa para convertir la lista de argumentos en variables léxicas. sub foo ($a,$b) {...} comprueba el número de argumentos y pone los argumentos en variables léxicas. Las firmas no son equivalentes al actual modismo sub foo { my($a,$b) = @_; ... }. Las firmas solo están disponibles al activar una característica desactivada por defecto, y genera avisos de que se trata de algo experimental. La diferencia sintáctica con los prototipos se gestiona desactivando la pequeña sintaxis de prototipo cuando se activan las firmas.
Vea "Firmas" en perlsub para más detalles. - subrutinas (sub) ahora toman un atributo de prototipo
Cuando se declare o defina una sub., se puede especificar su prototipo como un atributo a la sub. sustituyendo a los paréntesis que siguen al nombre.
Por ejemplo, sub foo($$){} podría reescribirse como sub foo : prototype($$){}. - Interpretación de prototipos más consistente
La presencia de múltiples caracteres ';' en los prototipos de subrutinas siempre ha sido tolerado y tratados como si fueran un único carácter. Existe un caso donde esto no sucede. Una subrutina cuyo prototipo comienza por '*' o ';*' puede afectar cuando se considera que una palabra simple es un nombre de método o llamada a subrutina. Esto se aplica ahora también al caso ';;;*'.
Se ha permitido el espacio en blanco dentro de los prototipos de subrutinas, de tal forma que sub( $ $ ) es equivalente a sub($$), pero hasta ahora se eliminaban cuando la subrutina era interpretada. Por lo tanto, el espacio en blanco no estaba permitido en prototipos creados por Scalar::Util::set_prototype. Ahora se permite, y el intérprete ya no elimina el espacio en blanco. Esto quiere decir que prototype &mysub devuelve el prototipo original, incluido el espacio en blanco y todo lo demás. - rand usa ahora un generador de números aleatorios consistente
Los perl anteriores usaban un generador de números aleatorios específica de la plataforma, variando entre libc rand(), random() o drand48().
Esto significa que la calidad de los números aleatorios de perl podría variar de plataforma en plataforma, desde los 15 bits del rand() en Windows a los 48 bits en las plataformas POSIX, como el drand48() de Linux.
Ahora Perl usa su propia implementación interna de drand48() en todas las plataformas. Esto no convierte al rand de perl en algo criptográficamente seguro. [perl #115928] - nueva sintaxis para las porciones
La nueva sintaxis de %hash{...} y %array[...] devuelven una lista de los pares clave/valor (o índice/valor). Vea "Porciones clave/valor en hash" en perldata. - Desreferencia postfija experimental
Cuando esté activa la característica postderef, estarán activadas las siguientes equivalencias sintácticas:Using perl Syntax Highlighting- $sref->$*; # lo mismo que ${ $sref } # interpola
- $aref->@*; # lo mismo que @{ $aref } # interpola
- $href->%*; # lo mismo que %{ $href }
- $cref->&*; # lo mismo que &{ $cref }
- $gref->**; # lo mismo que *{ $gref }
- $aref->$#*; # lo mismo que $#{ $aref }
- $gref->*{ $slot }; # lo mismo que *{ $gref }{ $slot }
- $aref->@[ ... ]; # lo mismo que @$aref[ ... ] # interpola
- $href->@{ ... }; # lo mismo que @$href{ ... } # interpola
- $aref->%[ ... ]; # lo mismo que %$aref[ ... ]
- $href->%{ ... }; # lo mismo que %$href{ ... }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Las marcadas como interpolación solo interpolan si también está activada la correspondiente característica postderef_qq. Esta característica es experimental y disparará avisos experimental::postderef-category cuando se use, a menos que se supriman.
Para más información, consulte la sección Sintaxis de desreferencia postfija en perlref. - Soporte de Unicode v6.3
- Nueva propiedad de patrón de expresión regular \p{Unicode}
Es un sinónimo para \p{Any} y coincide con el conjunto de puntos de código 0 - 0x10FFFF. - Mejor soporte para 64 bits
En plataformas de 64 bits, las funciones internas de array usan ahora desplazamientos de 64 bits, permitiendo a los array almacenar más de 2**31 elementos, si se tiene memoria disponible.
El motor de expresiones regulares ahora soporta cadenas de caracteres superiores a 2**31 caracteres. [perl #112790, #116907]
Las funciones PerlIO_get_bufsiz, PerlIO_get_cnt, PerlIO_set_cnt y PerlIO_set_ptrcnt ahora tienen SSize_t, en lugar de parámetros y valores de devolución en enteros. - use locale ahora funciona con localizaciones UTF-8
Hasta esta versión, solo estaban soportadas las localizaciones basadas en bytes, como la familia ISO 8859. Ahora, la cada vez mayor presencia de las localizaciones multibyte UTF-8 también está soportada. Una localización UTF-8 es aquella en que el conjunto de caracteres es Unicode y la codificación es UTF-8. La categoría de operaciones POSIX LC_CTYPE (cambio de tamaño de caja (como lc(), "\U"), y la clasificación de caracteres (\w, \D, qr/[[:punct:]]/)) bajo esta localización no funciona como si estuvieran activadas con locale, si no como si estuvieran bajo use feature 'unicode_strings', excepto que se siguen las reglas de entintado. La ordenación sigue siendo por el orden del punto de código. [perl #56820]. - -F ahora implica -a y -a implica -n
Anteriormente, -F sin -a no significaba nada, y -a sin -n o -p tampoco. Con este cambio si indica -F entonces se activan -a y -n; y si indica -a entonces se activa -n.
Puede seguir usando -p por su comportamiento añadido. [perl #116190] - Avisos de excepción con $a y $b
Las variables especiales $a y $b, utilizadas en sort, ahora quedan exentas de los avisos de "usadas una sola vez", incluso cuando no se usen en sort. Esto hace más fácil a los módulos en CPAN proveer de funciones en que se utilicen $a y $b para propósitos similares. [perl #120462]
- Ya no se puede usar do para llamar a subrutinas
La forma do SUBROUTINE(LIST) ha quedado como aviso de obsolescencia desde Perl v5.0.0, y ahora es un error de sintaxis. - Cambios en el escapado con comillas
El carácter después de \c en una cadena de caracteres doblemente entrecomillada ("..." o qq(...)) o en una expresión regular debe ser ahora un carácter imprimible y no puede ser '{'.
Un carácter '{' literal después de \B o \b es ahora un error fatal.
Esto quedó como obsoleto en perl v5.14.0. - El entintado sucede en más circunstancias; ahora es conforme a la documentación
Esto afecta a la coincidencia en expresiones regulares y en el cambio de tamaño de caja de una cadena de caracteres (lc, "\U", etc.) dentro del ámbito de use locale. Ahora el resultado queda entintado basado en la operación, sin importar los contenidos que tuviera la cadena de caracteres, como se indicaba en la documentación (perlsec, "SEGURIDAD" en perllocale). Anteriormente, para la operación de cambio de tamaño de caja, si la cadena no contenía caracteres que fueran afectados por el cambio de tamaño de caja, el resultado podría quedar no entintado. Por ejemplo, el resultado de uc() en una cadena vacía o en una que contenga solo puntos de código por encima del Latin1, ahora quedan entintados, no como antes. Esto Esto conduce a resultados más consistentes con el entintado. Los patrones de expresiones regulares entintan sus resultados no binarios (como $&, $2) si y solo si el patrón contiene elementos cuya coincidencia depende de su (potencialmente entintada) localización. Al igual que en el caso de las funciones de cambio de tamaño de caja, los contenidos actuales de la cadena de texto no importa, al contrario que antes. Por ejemplo, si el patrón contiene un \w, los resultados quedarán entintados incluso si la coincidencia no usa esa parte del patrón con la que coincide o no, porque una coincidencia \w depende de la localización. Sin embargo, por ejemplo, un '.' en un patrón, no activará el entintado, porque el punto coincide con un solo carácter, y lo que la localización actual no cambia de ninguna manera es qué coincide o no. - La salida de Data::Dumper puede cambiar.
- El carácter de punto decimal localizado ya no remanente después del ámbito de use locale
Esto realmente es un arreglo de un error, que algún programa ya ha tomado en cuenta, por lo queda aquí reflejado. La localización actual bajo que el programa corre se supone que no es visible al código Perl excepto del ámbito de un use locale. Sin embargo, y hasta ahora, bajo ciertas circunstancias, el carácter utilizado para el punto decimal (a menudo la coma) quedaba remanente fuera del ámbito. Si su código queda afectado por este cambio, simplemente añada un use locale.
Obsolescencias
- La clase carácter /\C/
La clase de caracteres /\C/ en las expresiones regulares ahora es obsoleta. Desde perl v5.22 en adelante generará un aviso, y desde perl v5.24 en adelante será un error de compilación en expresiones regulares. Si necesita examinar los bytes individuales que conforman un carácter codificado en UTF8, use utf8::encode() en la cadena de caracteres original. - Caracteres de control literales en nombres de variable
Esta obsolescencia afecta a cosas como $\cT, donde \cT es un control literal (como un NAK o carácter NEGATIVE ACKNOWLEDGE) en el código fuente. Sorprendentemente, parece que la intención original era la forma canónica de acceder a variables como $^T, con la forma con el ángulo añadida como alternativa.
La forma del control literal queda obsoleta por dos razones principales. Tenía errores incorregibles, como por ejemplo $\cI no funcionaba como un alias de $^I, y su uso no era compatible en plataformas que no fueran ASCII: mientras que $^T funciona en todas partes, \cT es un espacio en blanco en EBCDIC. [perl #119123] - Rutinas POSIX de coincidencia de caracteres
El uso de cualquiera de estas funciones del módulo POSIX queda ahora obsoleto: isalnum, isalpha, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper, y isxdigit. Las funciones tienen errores y no funcionan en cadenas de caracteres codificados en UTF-8. Vea sus entradas en POSIX para más información.
Se levanta un aviso en la primera llamada a cualquiera de ellas en cualquiera de los lugares del código en que se las llame (de tal forma que una sentencia dentro de un bucle levantará solo un aviso). - Eliminación de módulos
Los siguientes módulos serán eliminados de futuras distribuciones principales de perl, y entonces será necesario instalarlos desde CPAN. Aquellas distribuciones de CPAN que requieran estos módulos necesitarán listarlos ahora como prerequisitos.
Las versiones principales de estos módulos mostrarán avisos de la categoría "deprecated" (obsoletos) para alertarle de este hecho. Para silenciar estos avisos, instale los módulos desde CPAN.- CGI y los paquetes CGI:: asociados
- inc::latest
- Package::Constants
- Module::Build y los paquetes Module::Build:: asociados
- Herramientas eliminadas
Las siguientes herramientas serán eliminadas de futuras distribuciones de perl, y será necesario instalarlas desde CPAN.- find2perl
- s2p
- a2p
Mejoras en las prestaciones
- Perl tiene un nuevo mecanismo de copiar al escribir (copy-on-write) que evita la necesidad de copiar los almacenes internos de las cadenas de caracteres cuando se asignen de un escalar a otro. Esto hace que copiar cadenas de caracteres grandes sea mucho más rápido. Al modificar una de las dos (o más) cadenas de caracteres después de una asignación forzará entonces a crear una copia interna. Esto hace innecesario el paso por referencia de cadenas de caracteres, para aumentar la eficiencia.
Esta característica estaba disponible en v5.18.0, pero no estaba activada por defecto. - Perl tiene un optimizador para patrones de expresiones regulares. Analiza el patrón para buscar cosas como la longitud mínima que debe tener la cadena de caracteres con la que debe coincidir, etc. Ahora maneja mejor los puntos de código por encima del rango Latin1.
- Ejecutar una exp. reg. que contenga un ancla ^ (o sus variantes bajo la bandera /m) ahora es mucho más rápido, en más situaciones.
- Valores hash precalculados se usan ahora en más lugares durante la fase de búsqueda.
- La búsqueda de claves constantes en hash ($hash{key}, opuesto a $hash{$key}) ahora es realizada en tiempo de compilación, para aumentar la velocidad. Esta optimización también se aplica ahora a las porciones de hash.
- Los operadores and y or en contexto vacío, como las generadas para unless ($a && $b) y if ($a || b) ahora atajan directamente al final de la sentencia. [perl #120128]
- En ciertas situaciones, cuando return es la última sentencia en el ámbito de una subrutina, será optimizada eliminándola. Esto quiere decir que código como este:ahora será como:Using perl Syntax Highlightingpero notablemente más rápido. [perl #120765]Using perl Syntax Highlighting
- Código como:se optimiza ahora a:Using perl Syntax HighlightingUsing perl Syntax Highlighting
En combinación con la optimización introducida en v5.18.0, esto quiere decir que sentencias más largas de variables no inicializadas son también optimizadas, así:se convierte en:Using perl Syntax Highlighting[perl #121077]Using perl Syntax Highlighting - La creación de ciertas listas, incluyen porciones de hash y array, ahora es más rápido.
- La optimización para array indexados con un pequeño valor entero constante se amplía a enteros en el rango -128..127, en lugar de solo 0..255. Esto debería aumentar la velocidad de código Perl al usar expresiones como $x[-1], a expensas de código con (presumiblemente más raras) expresiones como $x[200].
- La primera iteración por un gran hash (usando claves o each) es ahora más rápido. Esto se consigue reservando espacio previamente es estado interno del iterador del hash, en lugar de crearlo de forma perezosa cuando se itera por el hash por primera vez. (Para hash pequeños, el iterador se crea solo cuando se necesita por primera vez. La asunción es que los hash pequeños son más probables de que sean usados como objetos, y por lo tanto nunca reservados. Para hash más grandes, es menos probable de que sea cierto, y el coste de almacenar el iterador es compensado por el coste de reservar espacio para el propio hash).
- Cuando se hace una coincidencia global con exp. reg. en una cadena que viene del operador readline o <>, ya no se copia los datos de forma innecesaria. [perl #121259]
- Desreferenciar (como en $obj->[0] or $obj->{k}) ahora es mucho más rápido cuando $obj es una instancia de una clase que tiene métodos sobrecargados, pero no sobrecarga ninguno de los métodos de desreferenciado @{}, %{}, y así.
- El optimizador de Perl ya no obvia la optimización de código que siga a ciertas expresiones eval {} (incluyendo aquellas con un aparente bucle infinito).
- La implementación hace ahora un mejor trabajo en evitar sinsentidos en tiempo de ejecución. Operaciones internas que crean operaciones "nulas" (las creadas como efecto colateral de la interpretación de programas Perl) se eliminan en tiempo de compilación. Ese borrado se aplica a algunas nuevas situaciones.
- Perl ahora hace menos E/S de disco cuando gestiona propiedades Unicode que cubran hasta tres rangos de puntos de código consecutivos.