URL: https://linuxfr.org/news/sortie-de-perl-5-22-0 Title: Sortie de Perl 5.22.0 Authors: anaseto Stéphane Aulery, Kwiknclean, palm123, ZeroHeure et BAud Date: 2015年04月05日T09:47:33+02:00 License: CC By-SA Tags: perl Score: 33 Le langage [Perl](https://fr.wikipedia.org/wiki/Perl_(langage)), initialement conçu pour la manipulation de texte, puis utilisé aujourd’hui pour tout un vaste pan d’applications, allant des frameworks web aux applications en biologie, continue à mûrir dans sa troisième décennie. Cette dépêche fait suite à la précédente concernant la [sortie de la version 5.16.0](https://linuxfr.org/news/perl-5-16-0), et résume les évolutions majeures depuis cette dernière (version 5.18.0 en mai 2013, 5.20.0 en mai 2014 et 5.22.0), qui sont le fruit du travail de plus d’une centaine de personnes. Un aperçu des évolutions de l’écosystème Perl 5 ces dernières années et de celui de sa petite sœur (ou petit frère) Perl 6 complète le tableau. ---- [Site officiel de Perl](http://www.perl.org/) [perldelta - what is new for perl v5.18.0](https://metacpan.org/pod/release/RJBS/perl-5.18.0/pod/perldelta.pod) [perldelta - what is new for perl v5.20.0](https://metacpan.org/pod/release/RJBS/perl-5.20.0/pod/perldelta.pod) [Groupe des utilisateurs français de Perl](http://mongueurs.pm/) [perldelta - what is new for perl v5.22.0](https://metacpan.org/pod/release/RJBS/perl-5.22.0/pod/perldelta.pod) ---- # La version 5.18.0 ## Langage Des opérations ensemblistes sur les classes de caractères sont possibles dans les regexps avec une nouvelle construction `(?[...])`. Par exemple : ``` perl use v5.18; use utf8; no warnings "experimental::regex_sets"; print "λ est une lettre grecque minuscule\n" if "λ" =~ /(?[\p{Greek} & \p{Lower}])/; print "Λ est une lettre grecque non minuscule\n" if "Λ" =~ /(?[\p{Greek} - \p{Lower}])/; ``` On peut maintenant déclarer avec `my` des fonctions lexicales, locales à un block (très expérimental). À ne pas confondre avec des références. Les mots-clés `next`, `last` et `redo` peuvent prendre en argument une expression quelconque calculant un label. D’autres changements significatifs comme : - Les motifs étendus expérimentaux `(?{})` et `(??{})`, qui permettent d’exécuter du code Perl dans une regexp, ont été améliorés (surtout des corrections de bogues et une sémantique plus claire) ; - Des fonctionnalités introduites dans la version 5.10 sont devenues expérimentales. En particulier `~~`, `given` et `when` sont expérimentaux maintenant, car leur implémentation s’est révélée problématique. ## Optmisations Quelques optimisations, comme : - `my ($x, $y)` est optimisé comme une seule opération ; - les regexps utilisant des propriétés Unicode sont plus rapides. ## Sécurité La fonction de hachage utilisée pour les tables de hachage fait l’usage d'une graine aléatoire, pour éviter des attaques de complexité algorithmique. # La version 5.20.0 ## Langage On peut activer la possibilité d’utiliser des signatures lors de la déclaration des fonctions. Les fonctions peuvent prendre maintenant un attribut `prototype`, afin de pouvoir utiliser les signatures et les prototypes en même temps. Par exemple, on pourra écrire : ``` perl no warnings 'experimental::signatures'; use feature 'signatures'; sub ouah ($chien) { # faire quelque chose avec le $chien } ``` Nouvelles syntaxes `%hash{...}` et `%array[...]` pour récupérer des listes paire/valeur ou index/valeur. Par exemple : ``` perl my %fruits = (pommes => 3, bananes => 5, oranges => 4); my %sous_ensemble = %fruits{'pommes', 'bananes'}; # %sous_ensemble est maintenant (pommes => 3, bananes => 5) my @alphabet = "a" .. "z"; my @tableau = %alphabet[1,3,5]; # @tableau est maintenant (1, "a", 3, "c", 5, "e"); ``` Une nouvelle syntaxe de déréférencement postfixée fait aussi son apparition. Ainsi, par exemple, on pourra écrire : ``` perl my $scalar = $scalar_ref->$*; # même chose que ${ $scalar_ref }, ou $$scalar_ref mais marche # pour une expression quelconque renvoyant une référence et peut # s’enchaîner facilement. ``` et c’est analogue pour les tableaux, les tables de hachage, les fonctions et les globs. ## Optimisations Un nouveau mécanisme de *copy-on-write* ([COW](https://fr.wikipedia.org/wiki/Copy-On-Write)) permet d’éviter d'avoir à passer des chaînes de caractères par référence pour des raisons de performances. En particulier : ``` perl my $copy = $str; ``` n’induit plus de vraie copie de la chaîne `$str`. La copie sera effective seulement si `$copy` ou `$str` est modifiée. Plusieurs déclarations à la suite : ``` perl my $x; my $y; ``` sont maintenant optimisées en : ``` perl my ($x, $y); ``` Les `return` en dernière instruction d’une fonction sont optimisés, c'est-à-dire qu'il n'y a plus de différence de performance entre `sub miaou {...; return $chat; }` et `sub miaou { ...; $chat; }`. D’autres optimisations ont été faites, par exemple dans les regexps, la gestion de l’Unicode, mais aussi autour des tableaux et des tables de hachage. ## Documentation Des nouveautés dans la documentation : - Le tutoriel [*perlopentut*](https://metacpan.org/pod/distribution/perl/pod/perlopentut.pod), pour ouvrir des fichiers et autres, a été réécrit. Il est maintenant plus court et utilise un style plus moderne ; - Un nouveau tutoriel sur l’Unicode a vu le jour, le [*perlunicook*](https://metacpan.org/pod/distribution/perl/pod/perlunicook.pod), qui explique les recettes importantes à connaître sur l’Unicode en Perl (il n’était pas dans la 5.20.0 mais a été backporté dans la 5.20.2). # La version 5.22.0 ## Langage Perl prend maintenant en charge Unicode 7.0. Un nouvel opérateur `<<...>>` apparaît, qui est comme `<...>`, mais agit comme un `open` à trois arguments pour les éléments de `@ARGV`, ce qui évite à un nom comme `"|foo"` d'être considéré comme une pipe et non comme un nom de fichier. On peut maintenant créer des alias en affectant à une référence : ``` perl \$alias = \$ref; # un cas peut-être plus parlant : foreach \%hash (@array_of_hash_refs) { ... } ``` Avec `use re 'strict';` des règles plus strictes peuvent êtres appliquées à l’écriture des regexps, de sorte à détecter d’éventuelles erreurs. Un nouvel attribut `const` permet de forcer la compilation immédiate d’une fonction anonyme vers une constante, même si les variables qui apparaissent dans sa déclaration sont modifiées ensuite. Avant, un simple `*CONST = sub () { $var }` était parfois compilé immédiatement, mais parfois non, par exemple si une autre variable faisait référence au même `$var`. Cette forme donne maintenant un warning si `$var` et utilisé après. Un nouveau modifieur `n` permet de désactiver les captures dans une regexp, de sorte que `(...)` devienne un raccourci commode pour `(?:...)`. Afin d’éviter les confusions entre les opérations bit-à-bit pour les nombres et les chaînes de caractères, avec `use experimental "bitwise";` de nouveaux opérateurs bit à bit `&. |. ^. ~.`, qui traitent leurs opérandes comme des chaînes de caractères (faisant une conversion si nécessaire), peuvent être utilisés. Les opérateurs `& | ^ ~` traitent alors toujours leurs arguments comme des nombres. On peut maintenant utiliser l'opérateur de répétition `x` pour une affectation. Ainsi, `(undef, undef, $var) = fun()` peut s'écrire `((undef) x 2, $var) = fun()`. ## Optimisations Les accès aux tableaux et tables de hachage sont plus rapides, en particulier s’ils sont imbriqués ou utilisent des clés constantes ou de simples variables. Dans une affectation `my @array = split`, la fonction `split` écrit maintenant, la plupart du temps, directement sur `@array`. D'autres fonctions ont connu des optimisations variées. ## Modules Le projet continue à réduire le cœur et certains modules, dont CGI et Module::Build, ainsi que des utilitaires comme s2p et a2p, sont maintenant à installer depuis CPAN (l'annonce de leur retrait futur du cœur avait été fait pour la 5.20). # Évolutions de l’écosystème Si le langage Perl en soi et sa partie centrale ont connu assez de nouveautés ces dernières années, le [[CPAN]] et l’écosystème Perl en général continuent à bouger aussi. Outre le connu [CPAN Search](http://search.cpan.org/) pour chercher des modules de CPAN, il existe maintenant une plateforme alternative au look un peu plus "jeune", [metacpan](https://metacpan.org/), dont les sources sont sous licence libre et disponibles. L’ensemble des modules du CPAN peut être installé avec le client en ligne de commande `cpan`. Depuis quelques années, une alternative plus légère et ne demandant aucune configuration existe : [cpanm](https://metacpan.org/pod/distribution/App-cpanminus/bin/cpanm). Notons aussi l’apparition de [perlbrew](https://metacpan.org/pod/distribution/App-perlbrew/bin/perlbrew), un outil permettant de gérer son environnement Perl et, en particulier, de pouvoir passer rapidement d’une version de Perl à une autre et de tester ainsi le code avec plusieurs versions. Ces outils sont bien sûr surtout utiles pour le développeur : vu que beaucoup de modules CPAN existent sous forme de paquets dans la plupart des distributions, l’utilisateur n’en aura pas besoin _a priori_. Une autre nouveauté ces dernières années est l’amplification du code utilisant de nouveaux systèmes objets autre que celui inclus dans Perl. Le plus connu est [Moose](https://metacpan.org/pod/Moose), qui fournit un système très riche, bien documenté et avec plein de fonctionnalités. Lorsque moins de fonctionnalités sont nécessaires, ou qu’un temps de démarrage plus rapide est important, on peut préférer utiliser par exemple [Moo](https://metacpan.org/pod/Moo), mais c’est loin d’être la seule alternative. Et rien n’interdit non plus d'en revenir aux origines. On note aussi dans la communauté une volonté de mettre en avant les évolutions du langage, comme en témoignent des initiatives récentes, telle celle du livre [Modern Perl](http://modernperlbooks.com/books/modern_perl_2014/), qui explique la philosophie de la communauté et comment profiter du CPAN, mais aussi la philosophie du langage (expressions idiomatiques, contexte...), et comment en tirer parti. # Et Perl 6 ? De son côté, [[Perl 6]] avance aussi, et [[Larry Wall]], le père fondateur, a annoncé qu’une première release aurait probablement lieu pour ce Noël (voire cette [interview](http://rebuild.fm/78/) par exemple), fondée sur son implémentation [Rakudo](http://rakudo.org/) et la machine virtuelle [MoarVM](http://www.moarvm.com/). Il s’agira d’une première release, donc en particulier il faut s’attendre à ce que les performances ne soient pas au rendez-vous partout, le langage n’a pas vingt ans d’optimisations accumulées, et ça se sent encore, mais la situation s’est quand même [nettement améliorée](http://jnthn.net/papers/2014-yapceu-performance.pdf) et certains aspects sont prometteurs. En particulier le [JIT](https://fr.wikipedia.org/wiki/Compilation_%C3%A0_la_vol%C3%A9e) de MoarVM et le typage graduel permettent d’optimiser des choses qu’il n'est pas possible d’optimiser en Perl 5. De plus, la Fondation Perl a lancé une [levée de fonds](http://news.perlfoundation.org/2015/04/wenzperl-donate-10000-eur-to-n.html) pour permettre au développeur principal de Rakudo de consacrer plus de temps à Perl 6 d’ici la première release. La documentation est un travail en cours, mais commence déjà à [ressembler à quelque chose](http://doc.perl6.org/). On est loin d'avoir un vrai CPAN pour le moment, mais un certain nombre de modules ont déjà [vu le jour](http://modules.perl6.org/), et la liste s'étend régulièrement.

AltStyle によって変換されたページ (->オリジナル) /