Les nouveautés de Perl 5.30

Sébastien Aperghis-Tramoni
sebastien@aperghis.net

Présentation

  • condensé de perldelta

  • 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

  • 5.24.0 le 9 mai 2016

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}

    • regexps : 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

  • principales nouveautés :

    • assertion de continuité de script (*script_run:pattern)

    • delete sur des tranches ; perl -i plus sûr

    • fonctions plus stockées dans des typeglobs

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

Perl 5.30

  • 5.30.0 le 22 mai 2019

    • 5.26 n'est plus officiellement supportée

  • 5.30.1 probablement vers septembre-octobre 2019

  • 5.30.2 probablement vers mars-avril 2020

Résumé

  • beaucoup de choses absconses liées à Unicode et aux expressions régulières

Nouveautés - regexps

  • assertions positive et négative de recherche alentours supportent (partiellement) un motif de longueur variable

    • (?<=pattern) et (?<!pattern)

    • (plus de détails sur ce sujet plus tard)

  • limite n dans le quantifieur {m,n} doublée à 65 534

  • qr'\N{name}' est maintenant supporté

Nouveautés - regexps

  • début d'implémentation de UTS #18 RL2.6 Wildcards in Property Values

  • \p{name=/VARIA(TION|NT)/} -- caractères dont le nom contient VARIATION ou VARIANT

  • \p{numeric_value=/\A[0-5]\z/} -- chiffres dont la valeur est entre 0 et 5

Unicode

  • Unicode 11.0.0 (5 juin 2018)

  • ajout de 684 caractères et 7 systèmes d'écriture

    • Dogra (60), Gunjala Gondi (63), Hanifi Rohingya (50), Makasar (25), Medefaidrin (91), Old Sogdian (40), Sogdian (42)

    • copyleft ; demi-étoiles ; symboles astrologiques

    • 66 nouveaux emojis

Unicode

  • Unicode 11.0.0 (5 juin 2018)

Unicode

  • Unicode 12.0.0 (5 mars 2019)

  • ajout de 554 caractères et 4 systèmes d'écriture

    • Elymaic (23), Nandinagari (65), Nyiakeng Puachue Hmong (71), Wancho (59)

    • 61 nouveaux emojis

  • reste encore une différence dans la gestion de certains espaces et de la propriété Word_Break

Unicode

  • Unicode 12.0.0 (5 mars 2019)

Unicode

  • Unicode 12.1.0 (7 mai 2019)

  • ajout du caractère U+32FF SQUARE ERA NAME REIWA

Locale

  • locale turque gérée de manière transparente :

  •   uc(i) → İ  (U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE)
      lc(I) → ı  (U+0131 LATIN SMALL LETTER DOTLESS)

(?<=pattern) et (?<!pattern)

  • (?<=pattern)

    • zero-width positive lookbehind assertion

    • exemple : /(?<=\t)\w+/ cherche un mot après une tabulation

  • (?<!pattern)

    • zero-width negative lookbehind assertion

    • exemple : /(?<!bar)foo/ cherche "foo" qui ne suit pas "bar"

(?<=pattern) et (?<!pattern)

  • motif doit être de longueur fixe :

      say $& if "aaabbb" =~ /(?<=aa?)b+/;
      # Variable length lookbehind not implemented in regex m/(?<=aa?)b+/

(?<=pattern) et (?<!pattern)

  • depuis 5.10, une forme de contournement avec \K :

  •   say $& if "aaabbb" =~ /aa?\Kb+/;
      say $& if "aaabbb" =~ /a+\Kb+/;
      # bbb
  • limite : uniquement en début de chaîne

(?<=pattern) et (?<!pattern)

(?<=pattern) et (?<!pattern)

  • à partir de 5.30, support limité de motif de longueur variable

  •   say $& if "aaabbb" =~ /(?<=a{1,10})b+/;
      # bbb
  • longueur inférieure à 255 caractères

  •   say $& if "aaabbb" =~ /(?<=a+)b+/;
      # Lookbehind longer than 255 not implemented in regex m/(?<=a+)b+/

(?<=pattern) et (?<!pattern)

  • formes alphabétiques :

    • (?<=pattern)(*plb:pattern) ou (*positive_lookbehind:pattern)

    • (?<!pattern)(*nlb:pattern) ou (*negative_lookbehind:pattern)

(?<=pattern) et (?<!pattern)

  • ...

Changements incompatibles

  • maintenant fatal :

    • assigner à $[ une valeur autre que zéro (5.12)

    • assigner à $* et $# (5.10)

    • accolade ouvrante non protégée ({) dans les regexps (5.20)

    • my $x if 0 (5.10)

    • dump() au lieu de CORE::dump() (5.8)

Changements incompatibles

  • maintenant fatal :

    • File::Glob::glob() au lieu de File::Glob::bsd_glob() (5.8)

    • pack() ne peut plus renvoyer une chaîne UTF-8 avec des séquences mal formées

    • utliser sysread(), syswrite(), send() ou recv() sur un descripteur avec :utf8 (5.24)

    • utilisation de délimiteurs qui ne sont pas des graphèmes

Modules

  • retirés de la distribution standard :

    • B::Debug, Locale::Codes

Optimisations

  • traduction UTF-8 vers code point plus rapide car maintenant faite par un DFA

  • quelques petites optimisations de cas particuliers dans les regexps

Questions ?

Merci