Perl 5.38.0 representa aproximadamente 12 meses de desarrollo desde Perl 5.36.0 y contiene aproximadamente 290 000 líneas modificadas a lo largo de 1500 archivos por parte de 100 autores.
Las novedades que trae (entre otras):
Cambios principales
- class
Ahora está disponible una nueva sintaxis experimental para definir clases de objetos, donde los datos de cada instancia se almacenan en variables "field" (campo) que se comportan como variables léxicas.
Código Perl:Se describe con más detalle en perlclass. Las notas sobre detalles internos de su implementación y otros detalles relacionados se pueden encontrar en perlclassguts.Ver original
- use feature 'class';
- class Punto
- {
- field $x;
- field $y;
- method cero { $x = $y = 0; }
- }
Se queda como característica nueva y experimental, y sigue estando en desarrollo. Será sujeto de más adiciones, refinamientos y alteraciones en versiones futuras. Como es experimental, lanza advertencias en la categoría experimental::class. Se pueden silencias con una sentencia no warnings:
Código perl:Ver original
- use feature 'class';
- Unicode 15.0
- Las advertencias de obsolescencia tienen ahora subcategorías específicas
Todas las advertencias de obsolescencia tienen ahora su propia categoría de obsolescencia que se puede desactivar individualmente. Puede ver una lista de las características obsoletas en perldeprecation, y en warnings. La siguiente lista es de warnings:
Código text:Sigue siendo posible desactivar todas las advertencias de obsolescencia con una única sentenciaVer original
- +- deprecated ----+
- | |
- | +- deprecated::apostrophe_as_package_separator
- | |
- | +- deprecated::delimiter_will_be_paired
- | |
- | +- deprecated::dot_in_inc
- | |
- | +- deprecated::goto_construct
- | |
- | +- deprecated::smartmatch
- | |
- | +- deprecated::unicode_property_name
- | |
- | +- deprecated::version_downgrade
Código perl:pero ahora es posible tener un control más fino. Como ha sido siempre, estas advertencias se activan automáticamente conVer original
Código perl:Ver original
- use warnings;
- PERL_RAND_SEED
Se añadió una nueva variable de entorno: PERL_RAND_SEED, que se puede usar para que un programa perl sea repetible, tanto si usa rand sin srand() explícitamente o use srand() sin argumentos. Vea perlrun. Esta característica se puede desactivar en tiempo de compilación pasando -Accflags=-DNO_PERL_RAND_SEED a Configure. - Expresiones de asignación por defecto con defined-or y logical-or en firmas de subrutinas
Se puede asignar ahora la expresión por defecto para el parámetro de una firma de subrutina utilizando los operadores //= y ||=, para aplicar valores por defecto tanto si el llamador proporciona un valor indefinido o falso (respectivamente), en los casos cuando el parámetro no se indica. Para más detalles vea la documentación en perlsub. - @INC Hook Enhancements and $INC and INCDIR
Las internas de los ganchos @INC se han reforzado para manejar varios casos límite y no deberían provocar fallos de segmentación o fallos de aserción cuando los ganchos modifican @INC durante una operación require. Ahora aseguramos que cualquier gancho proporcionado se ejecuta al menos una vez durante una llamada a require, y que cualquier directorio duplicado no dispara pruebas de directorio adicionales.
Ahora se da soporte a un nuevo método de enganche llamado INCDIR para proporcionar a los desarrolladores más control sobre la búsqueda de módulos dinámicos. Se puede inyectar un objeto que admita este método en la matriz @INC, y cuando se encuentra en el proceso de búsqueda del módulo, se ejecutará, al igual que se ejecutan los ganchos de INC, y su valor de retorno se usa como una lista de directorios para buscar ese módulo. Devolver una lista vacía actúa como un NO-OP. Tenga en cuenta que dado que cualquier referencia devuelta por este gancho se convertirá y se usará como cadena de caracteres, no puede devolver un gancho para ejecutarse más adelante a través de esta API.
Cuando se llama a un gancho @INC (ya sea INC o INCDIR) durante el require, la variable $INC se localizará para ser el valor del índice de @INC del que proviene el gancho. Si el gancho desea anular cuál debería ser el "próximo" índice en @INC, puede actualizar $INC para ser uno menos que el índice deseado (undef es equivalente a -1). Esto permite que un gancho @INC reescribe por completo la matriz @INC y haga que Perl reinicie sus sondas de directorio desde el comienzo de @INC.
Las referencias de CODE bendecidas en @INC que no admiten los métodos INC o INCDIR ya no dispararán una excepción, y en su lugar se tratarán de la misma manera que coderefs sin bendecir, y se ejecutarán como si fueran un gancho de INC. - Ahora se detecta en tiempo de compilación el uso de control de flujo prohibido fuera de defer o finally
Está prohibido intentar dejar un bloque defer o finally por medio de un control de flujo tales como return o goto. Versiones anteriores de perl sólo podría detectarlo cuando se intenta ejecutar en tiempo de ejecución.
Esta versión de perl añade detección en tiempo de compilación para muchos casos que se pueden determinar estáticamente. Esto puede significar que el código que se puede compilar exitosamente en una versión anterior de perl ahora se reporta como un error en tiemp de compilación. Esto sólo sucede en los casos donde ocurriría un error al ejecutar código de todas maneras; ahora el error sucede antes. - Evaluación optimista en patrones
El uso de (?{ ... }) y (??{ ... }) en un patrón desactiva varias optimizaciones en ese patrón, de forma global. Esto puede ser deseable o no por el programador. Esta publicación añade el equivalente (*{ ... }). La única diferencia es que no desactiva ni desactivará ninguna optimización en el motor regex. Esto puede hacerlo más inestable en el sentido de que puede llamarse más o menos veces en el futuro, sin embargo el número de veces que se ejecuta coincidirá exactamente con el funcinamiento del motor regex. Por ejemplo, ciertos tipos de optimización se desactivan cuando se incluye (?{ ... }) en un patrón, así que los patrones que son O(N) en un uso normal se convierten en O(N*N). Cambiar a (*{ ... }) significa que el patrón se mantendrá en O(N). - REG_INF se ha elevado desde 65 536 a 2 147 483 647
Muchos cuantificadores regex que estaban limitados en el pasado a U16_MAX, ahora están limitados a I32_MAX, así que ahora es possible escribir /(?:word){1000000}/ por ejemplo. Note que hacerlo así puede provocar que el motor de regex se ejecute durante más tiempo y usar más memoria. - Ahora se permite algunos goto en bloques defer y finally
Perl version 5.36.0 añadió bloques defer y permitió que la palabra clave finally añade un comportamiento similar para la sintaxis try/catch. Estos no permiten ninguna expresión goto dentro del cuerpo, ya que podría provocar un salto del control de flujo fuera del bloque. Ahora, se permiten a algunas expresiones goto, si se trata de un destino con una etiqueta constante, y que la etiqueta se encuentre dentro del bloque.
Código perl:Ver original
- Nueva variable de expresiones regulares ${^LAST_SUCCESSFUL_PATTERN}
Permite acceder al último patrón que coincidió de forma exitosa, en el ámbito actual. Muchos aspectos del motor de regex se refieren al "último patrón exitoso". El patrón vacío lo rechaza, y todas las variables regex mágicas se relacionan con él. Esto permite acceder a ese patrón. El código siguiente
Código perl:se puede reescribir comoVer original
- if (m/foo/ || m/bar/) {
- }
Código perl:haciendo lo mismo.Ver original
- if (m/foo/ || m/bar/) {
- s/${^LAST_SUCCESSFUL_PATTERN}/PQR/;
- }
Cambios incompatibles
- readline() ya no limpia los indicadores de error y eof
- los bloques INIT ya no se ejecutan después de un exit() en un BEGIN
Obsolescencias
- El uso de ' como separador de los nombres del paquete
- switch y el operador Smart Match (coincidencia inteligente)
La característica "switch" y el operador smartmatch ~~, se presentaron en v5.10. Su comportamiento se cambió significativamente en v5.10.1. Cuando el sistema "experiment" se añadió en v5.18.0, switch y smartmatch se declararon experimentales, de forma retroactiva. Durante estos años, se han propuesto y desechado propuestas para arreglarlos o suplementarlos.
En v5.38.0, declaramos el experimento como un fallo. Algunos otros sistemas futuros pueden tomar el lugar conceptual de smartmatch, pero no se han diseñado ni construido, todavía.
Estas características se eliminarán completamente en Perl v5.42.0.
Plataformas obsoletas
- Ultrix