Perl 5.28.0 representa, aproximadamente, 13 meses de desarrollo desde Perl 5.26.0 y contiene aproximadamente 730 000 líneas modificadas en 2200 archivos por parte de 77 autores.
Las novedades que trae:
Cambios principales
- Soporte para Unicode 10
- delete sobre porciones hash de pares clave/valor
- Experimentalmente, ahora tenemos sinónimos alfabéticos para algunas aserciones en expresiones regulares
- Detectable la mezcla de tipos de letra Unicode
- Más segura la edición in-situ con perl -i
- Inicialización de agregados de variables estáticas
- Soporte para tamaños de inodo más grandes
- El modificador de formato %j de sprintf ahora está disponible con los compiladores pre-C99
- El indicador close-on-exec se establece de forma atómica
- Las operaciones de número y cadena de bits ya no son experimentales
- Las configuraciones regionales son seguras a nivel de hilos de ejecución en los sistemas que los soporten
- Nueva variable predefinida de solo lectura ${^SAFE_LOCALES}
- [CVE-2017-12837] Sobrecarga de la pila en el compilador de expresiones regulares
- [CVE-2017-12883] Sobrecarga del búfer en el intérprete de expresiones regulares
- [CVE-2017-12814] Sobrecarga del búfer de pilas $ENV{$key} en Windows
- Cambio de la función hash por defecto
- Orden de los atributos y firma de las subrutinas
- Ya no se permiten listas de variables sin comas en los formatos
- Se han eliminado los atributos :locked y :unique
- \N{} sin nada entre las llaves es ahora ilegal
- Ya no se permite usar el mismo símbolo tanto como identificador de archivo como de directorio
- Ya no se permite el uso de << como si fuera <<""
- Ya no se permite establecer $/ a una referencia a un entero no positivo
- Los puntos de código Unicode con valores que excedan IV_MAX ahora son fatales
- Se ha eliminado el método B::OP::terse
- Ya no se permite el uso de AUTOLOAD heredado para los no-métodos
- Ya no se permite el uso de cadenas de caracteres con puntos de código por encima de 0xFF para los operadores de cadenas de bits
- Establecer ${^ENCODING} a un valor definido ahora es ilegal
- Las barras inversas ya no escapan los caracteres de dos puntos en PATH para la opción -S
- Se ha eliminado la característica inexistente -DH (DEBUG_H)
- Yada-yada ya es, estrictamente, una sentencia
- Ya no se puede especificar el algoritmo para sort
- Dígitos de distinta base en literales de punto flotante
- Tipo de retorno de unpackstring()
- El uso de vec en cadenas de caracteres con puntos de código por encima de 0xFF es obsoleto
- Algunos usos de "{" no escapadas en exp. reg. ahora son fatales
- El uso de una "{" no escapada inmediatamente después de un "(" en patrones de exp. reg. es obsoleto
- La asignación a $[ será fatal en Perl v5.30
- hostname() no aceptará argumentos en Perl v5.32
- B::Debug
- Se ha reducido enormemente la sobrecarga en el arranque de la creación de patrones de exp. reg. con propiedades Unicode (\p{...})
- Muchas expresiones de concatenación de cadenas de caracteres ahora son mucho más rápidas, debido a la introducción del código de operación interna multiconcat que combina múltiples concatenaciones, y opcionalmente un "=" o ".=", en una sola acción. Por ejemplo, aparte de recuperar $s, $a y $b, toda esta expresión se gestiona en una única operación:Using perl Syntax Highlighting
- $s .= "a=$a b=$b\n"
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Como caso especial, si la parte izquierda de una asignación es una variable léxica, o my $s, la propia operación recupera la variable léxica, que es mucho más rápido.
En general, cuanto más expresiones incluyan una mezcla de cadenas constantes y expresiones de variable, mayor sea la longitud, y más se mezclen juntos cadenas utf8 con otras que no, será más marcada la mejora. Por ejemplo, en un sistema x86_64, se ha medido que este código se ejecuta cuatro veces más rápido:Using perl Syntax Highlighting- my $s;
- my $a = "ab\x{100}cde";
- my $b = "fghij";
- my $c = "\x{101}klmn";
- for my $i (1..10_000_000) {
- $s = "\x{100}wxyz";
- $s .= "foo=$a bar=$b baz=$c";
- }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Además, las expresiones sprintf que tengan un formato constante conteniendo solo elementos de formato %s y %%, y que tengan un número fijo de argumentos, ahora se optimizan en una operación multiconcat. - La función incorporada ref() es ahora mucho más rápida en contexto booleano, ya que no se preocupa en construir una cadena temporal como Foo=ARRAY(0x134af48).
- keys() en contexto vacío y escalar es ahora más eficiente.
- El modismo de comparar el resultado de index() con -1 se ha optimizado específicamente. Por ejemplo,
- Bucles for() y construcciones similares ahora son más eficientes en la mayor parte de los casos.
- File::Glob se ha modificado para eliminar innecesarios pasos atrás y recursiones, gracias a Russ Cox. Vea https://research.swtch.com/glob para más detalles.
- La función de la API XS-level SvTRUE() API ahora es más eficiente.
- Varias operaciones que devuelven enteros ahora son más eficientes en contexto escalar/booleano.
- Las llamadas a require de un módulo que ya está cargado es ahora ligeramente más rápido. [perl #132171]
- El rendimiento de la coincidencia de patrones con [[:ascii:]] y [[:^ascii:]] se ha mejorado ligeramente excepto en las plataformas EBCDIC.
- Se han aplicado varias optimizaciones a la coincidencia con patrones de expresiones regulares, así que bajo ciertas circunstancias, se notarán ganancias de rendimiento significativas. Pero en una aplicación con muchos patrones distintos, se verá muy poca mejora.
- Se han aplicado otras mejoras a la gestión de UTF-8, pero no son un factor principal en la mayor parte de las aplicaciones.
- Eliminación de use vars
- El uso de DynaLoader se cambia por XSLoader en muchos módulos
- PowerUX / Power MAX OS