Les nouveautés de Perl 5.28

Sébastien Aperghis-Tramoni
sebastien@aperghis.net

Présentation

  • condensé des perldelta des 5.27.0 à 5.27.11

  • seulement les changements les plus marquants

Cycles de publication

  • planification des versions

    • une version majeure par an (Q2)

    • des versions mineures tous les 2-3 mois

  • cycle de dépréciation court

    • avertissement pendant quelques versions majeures

    • suppression à la version majeure suivante

    • modules retirés envoyés sur le CPAN

Précédentes versions majeures

  • 5.16.0 le 12 mai 2012

  • 5.18.0 le 18 mai 2013

  • 5.20.0 le 16 mai 2014

  • 5.22.0 le 1er juin 2015

Perl 5.24

  • 5.24.0 le 9 mai 2016

  • principales nouveautés :

    • déréférencement postfixé n'est plus expérimental

    • regexps : \b{lb}, \b{wb} ; détection d'erreurs à la compilation

    • autoderef, my $_ retirés

Perl 5.26

  • 5.26.0 le 30 mai 2017

  • principales nouveautés :

    • "." n'est plus dans @INC

    • documents ici-même indentables : <<~"EOF"

    • regexps : /xx ; {^CAPTURE}, %{^CAPTURE}, et %{^CAPTURE_ALL}

Perl 5.28

  • 5.28.0 le 20 mai 2018

    • 5.24 n'est plus officiellement supportée

  • 5.28.1 probablement vers septembre 2018

  • 5.28.2 probablement vers mars-avril 2019

Résumé

  • quelques nouveautés non négligeables

  • beaucoup de dépréciations fatales

  • la preuve que faire des versions de développement, et tout tester, est très utile

  • et bien sûr des correctifs et des optimisations

Nouveautés - regexps

  • assertion de continuité de script (script run) (expérimentale)

  • permet de détecter les changements de scripts, typiques des attaques par homographes

  • paypal.com vs раураl.com

  • (*script_run:pattern) ou (*sr:pattern)

Nouveautés - regexps

  • conseillé de le faire de manière atomique : (*script_run:(?>pattern))

  • (*atomic_script_run:pattern) ou (*asr:pattern)

  • quelques exceptions comme les chiffres ([0-9]), les caractères de ponctuation, les emojis et autres caractères spéciaux sont acceptés partout

Nouveautés - regexps

  • équivalents alphabétiques de certaines assertions (expérimental)

  •  Actuel         Équivalent alphabétique
     ------         -----------------------
     (?=...)        (*pla:...) ou (*positive_lookahead:...)
     (?!...)        (*nla:...) ou (*negative_lookahead:...)
     (?<=...)       (*plb:...) ou (*positive_lookbehind:...)
     (?<!...)       (*nlb:...) ou (*negative_lookbehind:...)
     (?>...)        (*atomic:...)

Nouveautés

  • delete fonctionne maintenant sur des tranches de clés-valeurs, et retourne les paires

      my %sanitised_values = delete %input_values{@allowed_keys};
      warn "Unknown key $_" for keys %input_values;
  • initialisation d'un tableau ou d'un hash persistant

      state @a = qw(x y z);
  • édition sur-place (perl -i) maintenant plus sûre

Nouveautés

  • sprintf %j disponible sur les compilateurs pré-C99, mais est non portable

  • drapeau close-on-exec positionné sur les descripteurs de fichiers

  • les opérateurs de bits sur les nombres (& | ^ ~) et les chaînes (&. |. ^. ~.) ne sont plus expérimentaux, mais doivent quand même être activés avec use feature "bitwise";

Nouveautés

  • support des opérations de locales multi-thread (POSIX 2008, Windows)

  • ${^SAFE_LOCALES} vaut 1 quand l'interpréteur est sans support de threads ou compilé sur un OS compatible

Unicode

  • Unicode 10.0.0

  • ajout de 8 518 caractères, dont 4 nouveaux systèmes d'écriture

    • Masaram Gondi (75), Nüshu (396), Soyombo (80), Zanabazar Square (72)

    • 56 nouveaux emojis ; symbole du Bitcoin

    • CJK Extension F (7,473 caractères Han)

    • 285 caractères hentaigana

Unicode

Changements incompatibles

  • les attributs :locked et :unique ont été supprimés

    • dépréciés depuis 5.12 et 5.10, respectivement

  • les attributs de fonction doivent maintenant précéder les signatures de fonction

      sub f :lvalue ($a, $b) { ... };  # 5.20; à partir de 5.28
      sub f ($a, $b) :lvalue { ... };  # de 5.22 à 5.26
  • ... (yada-yada) n'est plus accidentellement utilisable comme expression

Changements incompatibles

  • fonctions ne sont plus stockées dans des typeglobs

    • optimisation introduite dans 5.22

    • permet d'économiser beaucoup de mémoire

    • mais seulement dans main à cause d'un bug

    • maintenant généralisée, mais peut casser du code d'introspection qui s'attend à ce que tout ce qui est dans les stashes soit un typeglob

Changements incompatibles

  • grosse simplification du smartmatch et du switch

    • ~~ (smartmatch)

      • table de règles remplacée par une seule règle

      • l'opérande droite doit surcharger l'opérateur, et déterminer quel type de comparaison effectuer est de sa seule responsabilité

      • fournit toujours un contexte scalaire

Changements incompatibles

  • grosse simplification du smartmatch et du switch

    • when

      • plus de règles compliquées sur comment il traite son argument

      • séparé en deux constructions :

        • whereso, qui utilise toujours son argument comme une valeur de vérité

        • whereis, qui utilise toujours le smartmatch

Changements incompatibles

  • grosse simplification du smartmatch et du switch

    • default, considéré comme confus et inutile, a été retiré

    • given n'est plus magique et se contente de fournir un contexte scalaire

    • concept de topicalizer aboli

    • contrôle de flux unifié avec celui des boucles : maintenant équivalent à une boucle d'une unique itération

Changements incompatibles

  • g̶r̶o̶s̶s̶e̶ ̶s̶i̶m̶p̶l̶i̶f̶i̶c̶a̶t̶i̶o̶n̶ ̶d̶u̶ ̶s̶m̶a̶r̶t̶m̶a̶t̶c̶h̶ ̶e̶t̶ ̶d̶u̶ ̶s̶w̶i̶t̶c̶h̶

    • changement introduit dans 5.27.7 (2017-12-20)

    • retiré dans 5.27.8 (2018-01-20)

    • « devant l'étendue des problèmes que cela provoquait aux modules CPAN »

    • merci BBC (Bleadperl Breaks CPAN) d'Andreas König

    • smartmatch et switch seront certainement modifiés dans le futur, mais avec force avertissements préalables

Changements incompatibles

  • maintenant des erreurs fatales :

    • utiliser le même symbole dans open() et opendir() (5.10)

    • l'utilisation de << au lieu de <<"" (5.000)

    • la sélection d'algorithme de tri par use sort

Changements incompatibles

  • maintenant des erreurs fatales :

    • omettre les virgules entre les variables passées aux formats (5.000)

    • assigner à $/ une référence vers un entier négatif ou nul (5.20)

    • assigner à ${^ENCODING} une valeur définie (5.22)

Changements incompatibles

  • maintenant des erreurs fatales :

    • \N{} vide (5.24)

    • code points Unicode d'une valeur excédant IV_MAX (5.24)

    • présence de code points au dessus de 0xFF dans une chaîne passée à un opérateur de bit (5.24)

Dépréciations

  • assigner à $[ sera fatal en 5.30

  • vec sur une chaîne avec des codes points au dessus de 0xFF

  • passer un argument à Sys::Hostname::hostname() sera fatal en 5.32

  • regexps : accolade non protégée "{" immédiatement après une parenthèse "("

Dépréciations

  • modules B::Debug, Locale::Codes

Sécurité

  • retrait de plusieurs anciennes fonctions de hash

  • ajout de SBOX32

  • correctifs de CVE liés à des débordements de tampons

Changements internes

  • ajout de Perl_langinfo() pour supplanter nl_langinfo(3)

  • fonction Perl sprintf() (Perl_sv_vcatpvfn_flags()) fortement retravaillée pour corriger plusieurs bugs mineurs et l'accélérer dans certains cas

Changements internes

  • les modules XS peuvent automatiquement bénéficier des versions réentrantes des fonctions systèmes en ajoutant cette définition en début de fichier :

      #define PERL_REENTRANT

Optimisations

  • concaténation de multiples expressions bien plus rapide par l'introduction de l'opcode interne multiconcat

  • keys() est plus efficace en contextes scalaire et vide

  • plusieurs opérations renvoyant des entiers sont plus efficaces en contextes scalaires et booléen

Optimisations

  • if (index(...) != -1) { ... } est plus efficace

  • les boucles for() et constructions similaires sont plus efficaces

  • File::Glob est plus rapide

Optimisations

  • ref() est plus rapide en contexte booléen

  • durée de création des expressions régulières avec propriétés Unicode (\p{...}) grandement réduite dans la plupart des cas

  • performances de [[:ascii:]] et [[:^ascii:]] grandement améliorées

Support de plates-formes

  • plates-formes abandonnées

    • PowerUX / Power MAX OS

Questions ?

Merci