Après plus d'un an de développement depuis Perl 5.36, la version 5.38 de Perl vient d'être publiée et constitue la dernière mise à jour de ce langage de programmation. Cette mouture fournit une nouvelle syntaxe expérimentale pour définir les classes d'objets et prend désormais en charge l'Unicode 15.0. Elle propose également de nouvelles API, une nouvelle variable d'environnement pour la génération des nombres aléatoires, ainsi que divers autres changements. Améliorations de base
Nouvelle fonctionnalité pour les classes
Une nouvelle syntaxe expérimentale est désormais disponible pour définir des classes d'objets, où les données par instance sont stockées dans des variables " field " qui se comportent comme des lexiques.
| Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | use feature 'class';
class Point
{
field $x;
field $y;
method zero { $x = $y = 0; }
} |
Cette syntaxe est décrite plus en détail dans perlclass. Des notes sur les aspects internes de son implémentation et d'autres détails connexes peuvent être trouvés dans perlclassguts.
Il s'agit d'une fonctionnalité nouvelle et expérimentale, qui est encore en cours de développement. Elle fera l'objet d'ajouts, de raffinements et de modifications dans les prochaines versions. Comme il s'agit d'une fonctionnalité expérimentale, elle produit des avertissements dans la catégorie experimental::class. Ces avertissements peuvent être supprimés par une déclaration no warnings.
| Code : | Sélectionner tout |
1 2 | use feature 'class'; no warnings 'experimental::class'; |
Unicode 15.0 est désormais pris en charge
Voir Unicode 15.0.0 pour plus de détails.
Les avertissements de dépréciation ont maintenant des sous-catégories spécifiques
Tous les avertissements de dépréciation ont maintenant leur propre catégorie de dépréciation spécifique qui peut être désactivée individuellement. Vous pouvez voir une liste de toutes les fonctionnalités dépréciées dans perldeprecation, et dans warnings. La liste suivante provient des avertissements :
| Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | +- 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 |
Il est toujours possible de désactiver tous les avertissements de dépréciation en une seule déclaration avec la commande
| Code : | Sélectionner tout |
no warnings 'deprecated';
mais il est maintenant possible d'avoir un contrôle plus fin. Comme cela a toujours été le cas, ces avertissements sont automatiquement activés avec la commande
| Code : | Sélectionner tout |
use warnings;
Introduction de l'API %{^HOOK}
Pour diverses raisons, il peut être difficile de créer des wrappers de sous-programmes pour certains mots-clés de Perl. Tout mot-clé dont le prototype n'est pas défini ne peut tout simplement pas être encapsulé dans une sous-routine, et certains mots-clés que perl permet d'encapsuler sont en pratique très difficiles à intégrer. Par exemple, require est délicat à envelopper, c'est possible mais cela modifie la profondeur de la pile, et les méthodes standard d'exportation supposent qu'elles seront exportées vers un paquet à une certaine profondeur de la pile, et l'enveloppe changera donc l'endroit où les fonctions sont exportées à moins d'être implémentée avec beaucoup d'attention. Cela peut être très gênant à gérer.
C'est pourquoi un nouveau hachage appelé %{^HOOK} a été introduit afin de faciliter ce genre de situation. Lorsqu'un mot-clé supporte une sorte de crochet spécial, ce hook sera placé dans ce nouveau hachage. Les crochets de ce hachage seront nommés d'après la fonction par laquelle ils sont appelés, suivie de deux barres inférieures, puis de la phase dans laquelle ils sont exécutés, actuellement avant ou après l'exécution du mot-clé.
Cette version initiale supporte désormais deux types de crochets require__before et require__after. Ils sont fournis pour faciliter l'exécution de tâches avant et après une déclaration require.
PERL_RAND_SEED
Une nouvelle variable d'environnement PERL_RAND_SEED a été ajoutée et peut être utilisée pour faire en sorte qu'un programme perl qui utilise rand sans utiliser explicitement srand() ou qui utilise srand() sans arguments soit répétable. Voir perlrun. Cette fonctionnalité peut être désactivée à la compilation en passant l'option
| Code : | Sélectionner tout |
-Accflags=-DNO_PERL_RAND_SEED
à Configure pendant le processus de compilation.
Expressions par défaut des affectations définies-ou et logique-ou dans les signatures
L'expression par défaut pour un paramètre de signature de sous-routine peut maintenant être assignée en utilisant les opérateurs //= ou ||=, pour appliquer les valeurs par défaut lorsque l'appelant a fourni une valeur indéfinie ou fausse (respectivement), plutôt que simplement lorsque le paramètre est entièrement manquant. Pour plus de détails, voir la documentation de perlsub.
Améliorations des crochets @INC et $INC et INCDIR
La partie interne des crochets @INC a été renforcée pour gérer différents cas de figure et ne devrait plus générer de segfault ou d'assert failures lorsque les crochets modifient @INC au cours d'une opération require. Dans ce cadre, il est maintenant assuré qu'un crochet donné n'est exécuté qu'une seule fois lors d'un appel de requête, et que les répertoires dupliqués ne déclenchent pas de sondes de répertoires supplémentaires.
Pour permettre aux développeurs de mieux contrôler la recherche dynamique de modules, une nouvelle méthode de crochet, INCDIR, est désormais prise en charge. Un objet supportant cette méthode peut être injecté dans le tableau @INC, et lorsqu'il est rencontré dans le processus de recherche de module, il sera exécuté, de la même manière que les crochets INC sont exécutés, et sa valeur de retour sera utilisée comme une liste de répertoires à rechercher pour le module. Le retour d'une liste vide est un no-op. Notez qu'étant donné que toutes les références renvoyées par ce crochet seront transformées en chaînes et utilisées comme chaînes, vous ne pouvez pas renvoyer un crochet qui sera exécuté ultérieurement via cette API.
Lorsqu'un crochet @INC (soit INC ou INCDIR) est appelé pendant require, la variable $INC sera localisée pour être la valeur de l'index de @INC à partir duquel le crochet est venu. Si le crochet souhaite modifier l'index "next" de @INC, il peut mettre à jour $INC pour qu'il soit inférieur d'une unité à l'index désiré (undef équivaut à -1). Cela permet à un hook @INC de réécrire complètement le tableau @INC et de faire en sorte que perl redémarre ses sondages de répertoires à partir du début de @INC.
Les références blessed CODE dans @INC qui ne supportent pas les méthodes INC ou INCDIR ne déclencheront plus d'exception, et à la place seront traitées de la même manière que les références unblessed code, et exécutées comme s'il s'agissait d'un crochet INC.
Le flux de contrôle interdit en dehors de defer ou finally est maintenant détecté à la compilation
Il est interdit d'essayer de quitter un bloc defer ou finally au moyen d'un flux de contrôle tel que return ou goto. Les versions précédentes de perl ne pouvaient détecter cela qu'en cas de tentative à l'exécution.
Cette version de perl ajoute une détection à la compilation pour de nombreux cas qui peuvent être déterminés statiquement. Cela peut signifier que du code qui a été compilé avec succès dans une version précédente de perl est maintenant signalé comme une erreur de compilation dans cette version. Cela ne se produit que dans les cas où l'exécution du code aurait été de toute façon une erreur ; l'erreur se produit simplement à un moment antérieur.
Eval optimiste dans les motifs
L'utilisation de (?{ ... }) et de (??{ ... }) dans un motif désactive diverses optimisations globales dans ce motif. Cela peut être souhaité ou non par le programmeur. Cette version ajoute l'équivalent (*{ ... }). La seule différence est qu'il...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.