Perl 5.40 est sorti

Posté par  . Édité par Benoît Sibaud et Xavier Teyssier. Modéré par Xavier Teyssier. Licence CC By‑SA.
37
17
juin
2024
Perl

Perl est un langage généraliste créé en 1987 par Larry Wall. Il est distribué sous une double licence : Artistic Licence et GPL v1+. La plupart des modules du CPAN, dépôt de référence pour des modules tiers, sont également sous ces deux licences. Perl est inclus dans la quasi-totalité des distributions GNU/Linux.

La toute dernière version de Perl, la 5.40.0, est sortie le 9 juin 2024. Vous la retrouverez bientôt dans votre distribution préférée.

Sommaire

Améliorations notables

Nouveau mot clé __CLASS__

Lors de l’utilisation de la nouvelle fonctionnalité classe, le code à l’intérieur d’une fonction, d’un bloc ADJUST ou d’une expression d’initialisation de field peut maintenant utiliser le nouveau mot-clé __CLASS__.

use feature 'class';

class Example1 {
    field $f = __CLASS__->default_f;

    sub default_f { 10 }
}

Cela donne un nom de classe, similaire à __PACKAGE__, mais alors que celui-ci donne le paquetage de compilation dans lequel le code apparaît, le mot clé __CLASS__ donne la classe d’exécution réelle dont l’instance d’objet est membre.

class Example2 :isa(Example1) {
    sub default_f { 20 }
}

my $obj = Example2->new;
# $f aura maintenant la valeur 20

Cela le rend utile pour l’aiguillage des fonctions sur cette classe, en particulier lors des constructeurs, où l’accès à $self n’est pas autorisé.

un attribut :reader pour les variables field

Lors de l’utilisation de la fonctionnalité de classe, les variables de champ peuvent désormais prendre un attribut :reader. Ceci crée automatiquement une fonction qui renvoie simplement la valeur de la variable de champ de l’instance donnée.

field $name :reader;

est donc l’équivalent de

field $name;
method name () { return $name; }

On peut donner un nom différent à cette fonction :
field $name :reader(get_name);

Autoriser un espace dans l’option de ligne de commande -M

Lors du traitement des options de ligne de commande, Perl autorise désormais un espace entre le commutateur -M et le nom du module qui le suit.

$ perl -M Data::Dumper=Dumper -E 'say Dumper [1,2,3]'

Cela correspond au fonctionnement de l’option -I.

Restrictions d’utilisation des déclarations VERSION

Dans Perl 5.36, un avertissement de dépréciation avait été ajouté lors de la rétrogradation d’une déclaration d’utilisation VERSION d’une version supérieure à 5.11 vers une version inférieure. Ceci est désormais une erreur fatale.

De plus, c’est désormais une erreur fatale d’émettre une déclaration d’utilisation ultérieure VERSION lorsqu’une autre est dans la portée, lorsque l’une ou l’autre des versions est 5.39 ou supérieure. Un avertissement de dépréciation a également été ajouté pour toute autre déclaration d’utilisation ultérieure de VERSION inférieure à la version 5.39, pour avertir qu’elle ne sera plus autorisée dans la version Perl 5.44.

Nouvelles fonctions Builtin::inf et Builtin::nan

Deux nouvelles fonctions, inf et nan, ont été ajoutées à l’espace de noms intégré. Celles-ci agissent comme des constantes qui donnent respectivement la valeur infinie à virgule flottante et Not-a-Number.

Nouvel opérateur ^^ xor logique

Perl a toujours eu trois opérateurs logiques de faible priorité and, or et xor, ainsi que trois équivalents de priorité élevée &, ^ et | traitant les opérandes bit par bit. Jusqu’à cette version, alors que les opérateurs logiques de priorité moyenne && et || étaient présents, il n’y avait pas d’équivalent xor. Cette version de Perl ajoute l’opérateur ^^, complétant l’ensemble.
$x ^^ $y and say "L’un de x et y est vrai, mais pas les deux";

Le pragma features de 5.40 contient try / catch

Le mot-clé features active maintenant la fonctionnalité try / catch, récemment stabilisée. Comme cet ensemble de fonctionnalités est activé par l’option de ligne de commande -E, ceux-ci sont immédiatement disponibles dans les scripts lancés avec cette option.

Securité

CVE-2023-47038

Cette vulnérabilité a été remontée à l’équipe sécurité de Perl par Nathan Mills.

Une expression régulière compilée par perl 5.30.0 jusqu’à 5.38.0 peut provoquer un buffer overflow d’un octet contrôlé par l’attaquant.

CVE-2023-47039

Cette vulnérabilité a été remontée au Intel Product Security Incident Response Team (PSIRT) par l’utilisateur GitHub ycdxsb. Le PSIRT l’a ensuite remonté à l’équipe sécurité de Perl. À noter qu’elle ne concerne que Perl pour Windows.

Perl pour Windows dépend sur la variable d’environnement PATH pour trouver le shell (cmd.exe). Lorsqu’on lance un exécutable qui utilise l’interpréteur Perl, Perl essaie d’abord de trouver et utiliser cmd.exe dans le répertoire courant. Il est possible d’exploiter ce comportement pour faire exécuter du code malicieux à l’administrateur du poste.

Changements incompatibles avec les versions précédentes

reset EXPR appelle maitenant "set-magic" sur les scalaires

Précédemment, reset EXPR n’appelait pas les fonctions « magiques » lorsqu’il effaçait des variables scalaires. Cela signifiait que les changements n’étaient pas répercutés sur l’état interne des variables magiques lorsque c’était nécessaire, comme c’est le cas pour $W, et cela ne déclenchait pas d’exception lorsque la magie sous-jacente aurait dû déclencher une exception, comme pour $1.

Cela signifie que du code qui était jusqu’à présent sans effet peut, maintenant, avoir un effet, ou même déclencher une exception.

Il n’y a aucun effet pour un reset ordinaire dont le but est de réinitialiser les recherches simples appelées par m?regexp?

Avertissement lors de l’appel de la méthode import sur un paquetage inconnu

Historiquement, il était possible d’appeler la méthode import ou unimport pour n’importe quelle classe, y compris les classes qui n’ont pas été définies. Même si l’appel se faisait avec un argument, cela ne déclenchait pas d’erreur. Par exemple, le code suivant ne déclenche pas d’erreur en Perl 5.38:

Classe::qui::n::existe::pas->import("toto");

Toutefois, à partir de Perl 5.39.1, cette pratique est dépréciée et déclenche un avertissement. On peut remarquer que l’appel de ces méthodes sans argument continue à s’exécuter sans déclencher d’erreur. Par exemple

Classe::qui::n::existe::pas->import();

continue à ne pas déclencher d’erreur. C’est parce que toutes les classes dérivent implicitement de la classe UNIVERSAL, qui définit maintenant une méthode import. Dans les anciens Perl, cette méthode n’était pas définie pour UNIVERSAL. Au lieu de cela, les appels à import et à unimport étaient traités de façon spéciale de manière à ce qu’ils ne déclenchent pas d’erreur si la méthode correspondante n’était pas définie.

Ce changement a été mis en place pour faciliter la détection des fautes de frappe dans les instructions use, lorsque le programme tourne sur un système de fichiers avec des noms insensibles à la casse. Par exemple, sur Windows ou sur toute plateforme avec dse noms de fichier insensibles à la casse, avec un ancien Perl, le code suivant

use STRICT 'refs';

serait passé sans déclencher d’erreur et sans rien faire, car le module s’appelle réellement strict.pm au lieu de STRICT.pm, donc il aurait été chargé, mais sa fonction import n’aurait jamais été appelée. Cette nouveauté permet également de détecter le cas où un utilisateur ajoute un argument à la commande use pour un paquetage qui ne définit pas son propre import. C’est le cas entre autres pour la définition d’une classe « pure », qui ne définit pas de méthode « import ».

return ne permet plus de renvoyer un objet indirect

La syntaxe de l’opérateur return rejette maintenant les objets indirects. Jusqu’à présent, dans la plupart des cas, cela passait à la compilation et cela pouvait même s’exécuter, mais ce n’était pas documenté et cela pouvait produire des résultats prêtant à confusion. Par exemple :

  # Remarquez que « somme » n’a pas été défini
  sub somme_positive {
    return somme grep $_ > 0, @_;
    # interprété abusivement ainsi :
    #   return *somme, grep $_ > 0, @_;
    # avec le mot somme pris en tant que typeglob et transmis en tant qu’argument supplémentaire
  }
  say for somme_positive(-1, 2 ,3);

produisait

  *main::somme
  2
  3

Dans les appels de méthode, les noms de classe sans guillemets ne sont plus interprétés comme des handles de fichier si l’on a déclaré no feature "bareword_filehandles"

Si l’on déclare no feature "bareword_filehandles", les handles de fichier sans guillemets continuent à être acceptés dans les appels de méthode :

  open FH, "<", $somefile or die;
  no feature 'bareword_filehandles';
  FH->binmode;

Cela a été corrigé, donc maintenant la ligne

FH->binmode;

essaiera de résoudre FH en tant que classe, ce qui provoque habituellement une erreur à l’exécution.

Les handles de fichier standard tels que STDOUT continuent à être résolus en tant que handles :

no feature 'bareword_filehandles';
STDOUT->flush; # continues to work

Notez qu’une fois que Perl a résolu un nom sans guillemets en tant que classe, il continuera à le faire :

package SomeClass {
    sub somemethod{}
}
open SomeClass, "<", "somefile" or die;
# SomeClass résolu en tant que handle
SomeClass->binmode;
{
    no feature "bareword_filehandles";
    SomeClass->somemethod;
}
# SomeClass résolu en tant que classe
SomeClass->binmode;

Aller plus loin

  • # Exemple de gros produit/projet en Perl

    Posté par  (site web personnel, Mastodon) . Évalué à 10.

    Pour les curieux, qui se demanderaient "Perl, qui utilise encore ça ???", je vous invite à aller jeter un œil au projet https://koha-community.org
    Il a 24 ans, et il est toujours ultra-actif.
    Le logiciel équipe des milliers de bibliothèques de par le monde, dont plusieurs centaines en France (c'est le 2ᵉ logiciel le plus utilisé par les bibliothèques universitaires françaises)

    • [^] # Re: Exemple de gros produit/projet en Perl

      Posté par  (Mastodon) . Évalué à 9.

      Si je devais démarrer un truc aujourd'hui, Perl resterait dans la liste des langages considéré. Quand tu vois le bordel qu'est devenu le monde python et nodejs…

      • [^] # Re: Exemple de gros produit/projet en Perl

        Posté par  (site web personnel) . Évalué à 8.

        Perl est un langage puissant stable et TRES riche
        Son seul problème, à mon humble avis, reste sa lisibilité.

        Si tu le pratiques régulièrement, pas de problème
        Par contre si ce n'est pas ton "langage naturel" alors il devient difficile de lire ce que tu as écris quelque mois auparavant.

        Mais cela venait certainement de ma manière de coder en Perl.

        Et c'est le sens de ma question : comment Perl a t il évolué dans ce sens ?

        PS : sans compter que ce langage à de magnifiques livres de référence, égayé par l'humour de Larry Wall.

        Exemple : (de mémoire)

        " je laisse ce genre de choses aux amateurs de soirées cuir et chaines "

        • [^] # Re: Exemple de gros produit/projet en Perl

          Posté par  (Mastodon) . Évalué à 7.

          Bref perl n'a pas de problème de lisibilité. Certains developpeurs ont un problème de lisibilité et perl ne les limite pas.

          J'ai repris l'année dernière du code perl écrit par un collègue il y a moulte années et je n'ai eu aucun problème car il l'avait développé de sorte que ça soit lisible.

          • [^] # Re: Exemple de gros produit/projet en Perl

            Posté par  (site web personnel) . Évalué à 4.

            Perso, un jour j'ai pris le d'attendre Perl. Six mois après, sans pratiquer, c'était comme si je n'avais jamais touché ce langage. J'en garde l'image d'un langage bourré de symboles qui veulent dire des choses qui restent mystérieuses à moins de justement pratiquer régulièrement.

            Soit dit en passant, on présente suivent le fait que Perl ait été conçu par un linguiste comme un avantage. Perso, ça me donne surtout envie de conseiller aux linguistes de rester dans leur domaine…

        • [^] # Re: Exemple de gros produit/projet en Perl

          Posté par  (Mastodon) . Évalué à 5.

          Si tu le pratiques régulièrement, pas de problème
          Par contre si ce n'est pas ton "langage naturel" alors il devient difficile de lire ce que tu as écris quelque mois auparavant.

          Je connais des gens qui disent exactement la même chose de Python, egalité, balle au centre.

          • [^] # Re: Exemple de gros produit/projet en Perl

            Posté par  . Évalué à 3.

            Tout langage a des particularités, mais il me semble que perl en a plus que d'autres (et c'est une des raisons qui me font l'apprécier personnellement).

            Mais il évolue pour améliorer sa lisibilité avec comme gros exemple l'arrivée des signatures de fonctions (qui ont étaient inspirées par raku).

            Pour moi il est possible de classer les langages sur échelle qui va d'extrêmement lisible a extrêmement expressif. Dans le sens où l'un des extrêmes pousse à ce qu'un problème ai une et une seule solution alors que l'autre à ce qu'il y ai autant de solutions que de programmeurs. Il y a d'excellents langages de part et d'autre, mais ils ne sont pas fait pour les même choses ou pour les même personnes.

            Rien que dans la dépêche :

            $x ^^ $y and "L’un de x et y est vrai, mais pas les deux";
            $x xor $y && "Toujours vrai quelque soit x et y";

            https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll

        • [^] # Re: Exemple de gros produit/projet en Perl

          Posté par  . Évalué à 10.

          Son seul problème, à mon humble avis, reste sa lisibilité

          Et cela a été prouvé scientifiquement

          "93% of Paint Splatters are Valid Perl Programs"

      • [^] # Re: Exemple de gros produit/projet en Perl

        Posté par  (site web personnel, Mastodon) . Évalué à -1.

        python et nodejs

        Python n'est clairement pas fait pour du web ou alors de l'utra temporaire/petit trafic. Python est intrinsèquement lent (gourmand en ressources) mais simple à programmer tant que ça reste petit. Python est en revenche idéal pour du scripting rapide et souple.

        Par contre NodeJS est pas si mal. Il a de sacré atout (et des défauts bien entendus). Il est relativement puissant/performant, souple a une librairie de dingue, il est scalable… Ca reste du Javascript mais on peu faire du TypeScript…

        Sinon, que proposer? PHP se défends dans le web/script. C'est comme du Perl mais en moins niche, avec plus de framework. Ce n'est pas qu'il soit mieux techniquement mais il est un meilleur choix stratégique.

        Sinon, perso j'irais vers du Go ou du Julia (ou du NodeJS si cela se justifie point de vue environnement) pour rester dans les concurrents…

        Sous licence Creative common. Lisez, copiez, modifiez faites en ce que vous voulez.

        • [^] # Re: Exemple de gros produit/projet en Perl

          Posté par  (site web personnel) . Évalué à 0.

          que proposer? java…

          www.solutions-norenda.com

        • [^] # Re: Exemple de gros produit/projet en Perl

          Posté par  (site web personnel) . Évalué à 5.

          Puisque Python est évoqué, j'en profite pour vous faire (re)découvrir un interpréteur s'exécutant dans un navigateur, qui plus est réalisé par un français (cocorico !) : Brython. Je l'utilise justement pour un de mes projets : https://zelbinium.q37.info/fr/inspiration.

          Pour nous émanciper des géants du numérique : Zelbinium !

        • [^] # Re: Exemple de gros produit/projet en Perl

          Posté par  . Évalué à 2.

          bof Julia a un écosystème tout petit hors de la communauté scientifique et a toujours pas mal de problèmes (temps de compilation notamment).

          • [^] # Re: Exemple de gros produit/projet en Perl

            Posté par  (site web personnel, Mastodon) . Évalué à 1. Dernière modification le 19 juin 2024 à 05:01.

            Je ne dis pas le contraire Julia a des défauts. Mais il y a beaucoup de biding Python. Et sir les pères il assure. Même l'écosystème est sain/sympa.

            Sous licence Creative common. Lisez, copiez, modifiez faites en ce que vous voulez.

        • [^] # Re: Exemple de gros produit/projet en Perl

          Posté par  (Mastodon) . Évalué à 8.

          Le problème de nodejs ce ne sont pas les langages Javascript ou Typescript.

          Le problème c'est l'ecosystème avec une écrasante majorité de librairies et frameworks qui ne cherchent pas à avoir de compatibilité ascendante sur des longues années, voire abandonnent le projet au bout de quelques mois / un poignée d'année. C'est dur d'avoir des projet pérennes avec cela. J'ai repris du code il y a quelques semaines qui avait été abandonné il y a seulement 3 ans. La première chose à faire, c'est étudier le package.json pour supprimer les versions lockées, supprimer le package-lock.json et faire un npm install en local pour voir toutes les upgrades de modules qui ne peuvent pas se faire parce que les modules soit n'existent plus et sont gorgés de CVE, soit ont tellement de cassage de compatibilité que tu vas devoir réadapter tout ton code.

          On devrait pouvoir mettre à jour les dépendances avec la confidence que les CVE vont être corrigées et sans tout péter.

    • [^] # Re: Exemple de gros produit/projet en Perl

      Posté par  (Mastodon) . Évalué à 7.

      Sympa :)

      J'ajoute Sympa qui est pas mal utilisé pour gérer les listes de diffusions.

    • [^] # Re: Exemple de gros produit/projet en Perl

      Posté par  . Évalué à 6.

      Perl, qui utilise encore ça ???

      Il y a aussi le SSO LemonLDAP::NG !

    • [^] # Re: Exemple de gros produit/projet en Perl

      Posté par  (site web personnel) . Évalué à 3. Dernière modification le 18 juin 2024 à 06:18.

      À peu prés aussi ancien, toujours activement maintenu (et que j'utilise quotidiennement) : Lyrion Music Server.

      Pour nous émanciper des géants du numérique : Zelbinium !

    • [^] # Re: Exemple de gros produit/projet en Perl

      Posté par  (site web personnel) . Évalué à 3.

    • [^] # Re: Exemple de gros produit/projet en Perl

      Posté par  . Évalué à 2.

    • [^] # Proxmox !

      Posté par  . Évalué à 2.

      Proxmox a, me semble-t-il, pas mal de bouts en Perl.

  • # Nouveau opérateur

    Posté par  . Évalué à 4.

    Nouvel opérateur ?

  • # formatage Markdown

    Posté par  . Évalué à 6. Dernière modification le 17 juin 2024 à 14:57.

    Attention, c'est __CLASS__ et __PACKAGE__ et pas CLASS et PACKAGE pour les nouveaux mots-clé.

    Il faut les mettre entre backticks pour enlever le formatage Markdown.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.