Vue normale

Il y a de nouveaux articles disponibles, cliquez pour rafraîchir la page.
À partir d’avant-hierinformatique général
  • ✇LinuxFr.org : les dépêches
  • Perl 5.42 est sorti
    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, parfois installé par défaut. La toute dernière version de Perl, la 5.42.0, est sortie le 3 juillet 2025. Vous la retrouverez bientôt dans votre distribution préférée. L’association Le

Perl 5.42 est sorti

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, parfois installé par défaut.

La toute dernière version de Perl, la 5.42.0, est sortie le 3 juillet 2025. Vous la retrouverez bientôt dans votre distribution préférée.

L’association Les Mongueurs de Perl fait la promotion du langage dans les pays francophones, et ce depuis la fin de l’année 2001

Sommaire

Améliorations principales

Nouveaux sous-programmes CORE::

chdir a été ajouté comme sous-programme à l'espace de noms CORE::.

Jusqu’ici, du code comme &CORE::chdir($dir) ou my $ref = \&CORE::chdir;
$ref->($dir)
renvoyait une erreur indiquant que &CORE::chdir ne peut pas être appelé directement. Ces cas sont désormais entièrement pris en charge.

Nouveau pragma source::encoding

Voir source::encoding

Ceci vous permet de déclarer que la partie d’un programme correspondant au reste de la portée lexicale de ce pragma est encodée soit entièrement en ASCII (pour use source::encoding 'ascii'), ou que l’UTF-8 est autorisé également (pour use source::encoding 'utf8'). Aucun autre codage n’est accepté. La seconde forme est entièrement équivalente à use utf8 et peut être utilisée de manière interchangeable.

Ce pragma a pour but de détecter rapidement les cas où vous avez oublié de spécifier use utf8.

use source::encoding 'ascii' est automatiquement activé dans la portée lexicale d’un use v5.41.0 ou supérieur.

no source::encoding désactive toutes ces vérifications pour le reste de sa portée lexicale. La signification des caractères non-ASCII n’est alors pas définie.

Nouvel attribut :writer sur les variables de champ

Les classes définies avec use feature 'class' peuvent désormais créer automatiquement des accesseurs d’écriture pour les champs scalaires, à l’aide de l’attribut :writer, de la même manière que :reader crée déjà des accesseurs de lecture.

class Point {
field $x :reader :writer :param;
field $y :reader :writer :param;
}


my $p = Point->new( x => 20, y => 40 );
$p->set\_x(60);

Nouveaux opérateurs any et all

Ajout de deux nouvelles fonctionnalités expérimentales, introduisant les opérateurs de traitement de liste any et all.

use v5.42 ;
use feature 'keyword\_all' ;
no warning 'experimental::keyword\_all' ;


my @nombres = ...


if ( all { $\_ % 2 == 0 } @nombres ) {
  say "Tous les nombres sont pairs" ;
}

Ces mots-clés fonctionnent de manière similaire à grep, sauf qu’ils ne renvoient que vrai ou faux, testant si un des éléments (ou tous) de la liste fait que le bloc de test renvoie vrai. De ce fait, ils peuvent court-circuiter, évitant ainsi de tester d’autres éléments si un élément donné détermine le résultat final.

Ces fonctions s’inspirent des fonctions du même nom du module List::Util, à la différence qu’elles sont implémentées comme des opérateurs de base directs, et donc plus rapides, et ne génèrent pas de trame de pile d’appel de sous-routine supplémentaire pour invoquer le bloc de code.

Les indicateurs de fonctionnalité activant ces mots-clés ont été nommés keyword_any et keyword_all afin d’éviter toute confusion avec la capacité du module feature à faire référence à toutes ses fonctionnalités à l’aide de la balise d’exportation :all. [GH #23104]

Les indicateurs d’avertissement expérimentaux associés sont donc nommés experimental::keyword_any et experimental::keyword_all.

L’apostrophe comme séparateur de noms global peut être désactivée.

Ceci a été déclaré obsolète dans Perl 5.38 et supprimé comme prévu dans Perl 5.41.3, mais, après discussion, il a été rétabli par défaut.

Ceci peut être contrôlé avec la fonctionnalité apostrophe_as_package_separator, activée par défaut, mais désactivée à partir du bundle de fonctionnalités 5.41.

Si vous souhaitez désactiver son utilisation dans votre propre code, vous pouvez la désactiver explicitement :

no feature "apostrophe\_as\_package\_separator";

Notez que la désactivation de cette fonctionnalité empêche uniquement l’utilisation de l’apostrophe comme séparateur de paquets dans le code ; les références symboliques traitent toujours ' comme :: même si la fonctionnalité est désactivée :

my $symref = "My'Module'Var";
\# fonctionnalités par défaut
my $x = $My'Module'Var; # fine
no feature "apostrophe\_as\_package\_separator";
no strict "refs";
my $y = $$symref; # comme $My::Module::Var
my $z = $My'Module'Var; # erreur de syntaxe

[GH #22644]

Déclaration de méthode lexicale avec my method

Comme sub depuis la version 5.18 de Perl, method peut désormais être préfixé par le mot-clé my. Cela déclare une sous-routine avec une visibilité lexicale, plutôt que de package. Voir perlclass pour plus de détails.

Opérateur d’invocation de méthode lexicale ->&

Outre la possibilité de déclarer des méthodes de manière lexicale, cette version permet également d’invoquer une sous-routine lexicale comme s’il s’agissait d’une méthode, sans passer par la résolution habituelle des méthodes par nom.

Combinées à la déclaration de méthode lexicale, ces deux nouvelles fonctionnalités créent l’effet de méthodes privées.

Opérateur de commutation et de correspondance intelligente conservé, derrière une fonctionnalité

La fonctionnalité « switch » et l’opérateur de correspondance intelligente, ~~, ont été introduits dans la version 5.10. Leur comportement a été considérablement modifié dans la version 5.10.1. Avec l’ajout du système « experiment » dans la version 5.18.0, le « switch » et le smartmatch ont été rétroactivement déclarés expérimentaux. Au fil des ans, les propositions visant à corriger ou à compléter ces fonctionnalités ont été nombreuses et ont été abandonnées.

Elles ont été déclarées obsolètes dans Perl v5.38.0 et leur suppression était prévue dans Perl v5.42.0. Après de longues discussions, leur suppression a été reportée sine die. Leur utilisation ne génère plus d’avertissement d’obsolescence.

Switch lui-même nécessite toujours la fonctionnalité switch, activée par défaut pour les bundles de fonctionnalités de la version 5.9.5 à la version 5.34. Switch reste désactivé dans les bundles de fonctionnalités 5.35 et ultérieurs, mais peut être activé séparément :

\# pas de switch ici
use v5.10;
\# switch accepté ici
use v5.36;
\# pas de switch ici
use feature "switch"; # switch accepté ici

La correspondance intelligente nécessite désormais la fonctionnalité smartmatch, activée par défaut et incluse dans tous les bundles de fonctionnalités jusqu’à la version 5.40. Elle est désactivée à partir de la version 5.41, mais peut être activée séparément :

\# smartmatch accepté ici
use v5.41;
\# pas de smartmatch ici
use feature "smartmatch";
\# smartmatch accepté ici

[GH #22752]

Unicode 16.0 pris en charge

Perl prend désormais en charge Unicode 16.0, y compris les modifications introduites dans la version 15.1.

Assignation de l’opérateur logique xor ^^=

Perl 5.40.0 avait introduit l’opérateur logique OU exclusif à priorité moyenne ^^. L’absence de la variante d’assignation ^^= n’avait pas été remarquée à l’époque. Cet oubli est désormais corrigé.

Sécurité

[CVE-2024-56406] Vulnérabilité de dépassement de tampon avec tr//

Une vulnérabilité de dépassement de tampon a été découverte dans Perl.

Lorsque des octets non-ASCII se trouvent à gauche de l’opérateur tr, S_do_trans_invmap() peut faire déborder le pointeur de destination d.

$ perl -e '$\_ = "\x{FF}" x 1000000; tr/\xFF/\x{100}/;'
Segmentation fault (core dumped)

On pense que cette vulnérabilité peut permettre des attaques par déni de service ou par exécution de code arbitraire sur les plateformes dépourvues de défenses suffisantes.

Ce problème a été découvert par Nathan Mills et déclaré [CVE-2024-56406] par le groupe de sécurité CPAN.

Le correctif pour corriger ce problème (87f42aa0e0096e9a346c9672aa3a0bd3bef8c1dd) s’applique à tous les Perl vulnérables, y compris ceux qui ne sont plus pris en charge.

[CVE-2025-40909] Les threads Perl présentent une situation de concurrence entre les répertoires de travail : les opérations sur les fichiers peuvent cibler des chemins non prévus.

Le clonage de threads Perl présentait une situation de concurrence entre les répertoires de travail : les opérations sur les fichiers peuvent cibler des chemins non prévus. Perl 5.42 ne fera plus un chdir avec chaque handle.

Ce problème a été découvert par Vincent Lefèvre via [GH #23010] et déclaré [CVE-2025-40909] par le groupe de sécurité CPAN.

Des correctifs ont été fournis via [GH #23019] et [GH #23361].

Modifications incompatibles

Suppression des références de fonctions englobantes pour les fonctions sans évaluation

Perl 5.40 a réintroduit les références inconditionnelles des fonctions vers les fonctions englobantes afin de corriger un bug introduit dans Perl 5.18 qui perturbait le comportement spécial de eval EXPR dans le paquet DB utilisé par le débogueur.

Dans certains cas, cette modification entraînait des chaînes de références circulaires entre les fermetures et d’autres références existantes, entraînant des fuites de mémoire.

Cette modification a été annulée, corrigeant le problème [GH #22547], mais le perturbant à nouveau [GH #19370].

Cela signifie que les boucles de référence ne se produiront pas et que les variables lexicales et les fonctions lexicales des fonctions englobantes pourraient ne pas être visibles dans le débogueur.

Notez que l’appel inconditionnel de eval EXPR dans une fonction force celle-ci à référencer ses fonctions englobantes comme elle l’a toujours fait.

Améliorations des performances

  • Les chaînes obtenues par une formule évaluée à la compilation sont désormais partageables via le mécanisme de copie sur écriture. [GH #22163]

Le code suivant aurait auparavant alloué onze tampons de chaînes, contenant chacun un million de « A » :

    my @scalars; push @scalars, ("A" x 1\_000\_000) for 0..9;

Un seul tampon est désormais alloué et partagé entre une opération CONST et les dix éléments scalaires de @scalars.

Notez que tout code utilisant ce type de constante pour simuler des fuites mémoire (par exemple dans des fichiers de test) doit désormais permuter la chaîne afin de déclencher une copie de la chaîne et l’allocation de tampons séparés. Par exemple, ("A" x 1_000_000).time pourrait être une petite modification appropriée.

  • tr/// s’exécute désormais à la même vitesse, quelle que soit la représentation interne de son opérande, tant que les seuls caractères traduits sont de type ASCII, par exemple : tr/A-Z/a-z/. Auparavant, si l’encodage interne était UTF-8, une implémentation plus lente et plus générale était utilisée.
  • Le code qui utilise la fonction indexed du module builtin pour générer une liste de paires index/valeur à partir d’un tableau ou d’une liste, puis la transmettre à une liste foreach à deux variables pour les décompresser, est désormais optimisé pour être plus efficace.
    my @array = (...);


    foreach my ($idx, $val) (builtin::indexed @array) {
    ...
    }



    foreach my ($idx, $val) (builtin::indexed LIST...) {
    ...
    }

En particulier, il n’y a plus génération d’une liste temporaire deux fois plus grande que l’originale. Au lieu de cela, la boucle parcourt le tableau ou la liste d’origine directement sur place, de la même manière que foreach (@array) ou foreach (LIST).

  • L’optimiseur à lucarne reconnaît les motifs substr à décalage nul suivants et les remplace par un nouvel opérateur dédié (OP_SUBSTR_LEFT). [GH #22785]
    substr($x, 0, ...)
    substr($x, 0, ..., '')
  • La transformation en chaîne des entiers par "print" in perlfunc et "say" in perlfunc, lorsqu’ils proviennent d’un SVt_IV, est désormais plus efficace. [GH #22927]
  • L’inversion de chaîne à partir d’un seul argument, lorsque le tampon de chaîne n’est pas « balayé », s’effectue désormais en une seule passe et est sensiblement plus rapide. L’ampleur de l’amélioration dépend du compilateur et du matériel. [GH #23012]

Commentaires : voir le flux Atom ouvrir dans le navigateur

  • ✇LinuxFr.org : les dépêches
  • Perl 5.40 est sorti
    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. lien nᵒ 1 : Perl sur Wikipedialien nᵒ 2 : Guide P

Perl 5.40 est sorti

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;

Commentaires : voir le flux Atom ouvrir dans le navigateur

❌
❌