URL: https://linuxfr.org/news/sortie-de-perl-5-32-0 Title: Sortie de Perl 5.32.0 Authors: contra-sh theojouedubanjo, Davy Defaud, Benoît Sibaud, barmic, bistouille, Xavier Teyssier, palm123, Xavier Claude, Vroum, ZeroHeure, Ysabeau, dourouc05 et Olivier LEMAIRE Date: 2020-06-03T11:03:35+02:00 License: CC By-SA Tags: perl Score: 4 [Perl](https://www.perl.org/) est un langage généraliste créé en 1987 par [Larry Wall](https://fr.wikipedia.org/wiki/Larry_Wall). « _Perl continue de prospérer dans sa quatrième décennie grâce à une communauté d’utilisateurs et de développeurs très dynamique._ », _dixit_ [perldelta](https://metacpan.org/pod/distribution/perl/pod/perldelta.pod#Acknowledgements). Perl est distribué sous une double licence : [Artistic Licence](https://opensource.org/licenses/Artistic-2.0) et [GPL v1+](https://www.gnu.org/licenses/gpl-3.0.html). La plupart des modules du CPAN [suivent également ce même traitement](https://www.cpan.org/misc/cpan-faq.html#How_is_Perl_licensed). ![Perl 5 raptor](https://camo.githubusercontent.com/039c0b770fdaff0f1418c5afa4296dfaba5f2875/68747470733a2f2f7261772e6769746875622e636f6d2f6b726169682f7065726c2d726170746f722f6d61737465722f6578616d706c652e706e67)  _« Perl 5 raptor » de [kraih](https://github.com/kraih/perl-raptor), licence [CC BY‑SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)_ Tout d’abord un petit lien vers la précédente [dépêche sur la sortie de Perl 5.30.0](https://linuxfr.org/news/sortie-de-perl-5-30-0) qui explique en particulier le « _releasing flow_ » et des termes spécifiques à la communauté Perl (_blead_, _pumpking_, etc.). ---- [Perl](https://www.perl.org/) [MetaCPAN](https://metacpan.org/) [Perldelta 5.32.0 (dernier journal des modifications)](https://metacpan.org/pod/release/XSAWYERX/perl-5.32.0/pod/perldelta.pod) ---- # Rétrospective de 2019 et même un peu plus, morceaux sélectionnés ## Les Perl porters migrent vers GitHub Les développeurs de Perl 5, sous l’impulsion de leur *pumpking* (mainteneur en chef) [Sawyer X](https://github.com/xsawyerx), ont décidé de migrer le dépôt ainsi que le gestionnaire de tickets de Perl 5 vers [GitHub](https://github.com/Perl/perl5). Cela a consisté en deux choses : - migrer le code depuis _[perl5.git.perl.org](https://perl5.git.perl.org/perl.git)_ vers [Perl 5 sur GitHub](https://github.com/Perl/perl5) ; le dépôt GitHub existait déjà en miroir, le dépôt principal devient donc le miroir et le miroir devient le dépôt principal :D ; - migrer les tickets depuis [Perl Request Tracker](https://rt.perl.org/Public/Search/Results.html?Query=Queue%20=%20%27perl5%27) vers [GitHub issue tracker](https://github.com/Perl/perl5/issues), ça peut paraître simple, mais il y avait beaucoup de tickets et a fallu « scripter » pour récupérer et réinjecter les tickets (pour modifier les URL par exemple). ## Version majeure de Request Tracker L’entreprise [Best Practical](https://bestpractical.com) fondée par [Jesse Vincent](https://fr.wikipedia.org/wiki/Jesse_Vincent) (un dev Perl très reconnu et ancien Perl Pumpking) derrière le logiciel professionnel de ticketing [Request tracker](https://bestpractical.com/request-tracker) a annoncé [l’arrivée imminente de la version **5**](https://bestpractical.com/blog/2019/12/20-years-of-rt-starting-20-more-with-rt-5-mtz8c) puis la disponibilité de la [5.0.0 beta 1](https://bestpractical.com/blog/2020/5/rt-50-beta-1-now-available). Cette version contient notamment la migration vers [Bootstrap](https://getbootstrap.com) en tant que cadriciel CSS et le passage à [chart.js](https://www.chartjs.org/) pour les graphiques. [Request Tracker](https://bestpractical.com/request-tracker) est un géant de la gestion de tickets d’incident, utilisé par de très nombreuses industries dans le monde entier. C’est un logiciel de gestion de tickets d’incident de qualité professionnelle, sous licence GPL v2 ([code source](https://github.com/bestpractical/rt)), avec des possibilités infinies de personnalisations et d’interfaçage. Vous pouvez trouver le code source sur le [dépôt GitHub](https://github.com/bestpractical/rt), ainsi que de [la doc et du support français](https://www.request-tracker.fr/), par [Easter‑Eggs](https://www.easter-eggs.com/Presentation-d-Easter-eggs), qui est une [entreprise française du Numérique libre](https://cnll.fr/news/les-ssll-deviennent-enl/). Longue vie a RT5 ! ![Logo RT](https://i.imgur.com/ifHwJNH.png) ## Programmation orientée objet native bientôt intégrée dans le cœur de Perl L’année 2019 a été également celle d’un travail sur le module **Cor**, qui veut apporter l’orienté objet dans le cœur de Perl. En effet, Perl permet de simuler facilement l’orienté objet depuis toujours avec les notions de ***packages*** et les ***tie***/***bless***, mais ce n’est pas hyper élégant. De nombreux très bons modules ont ainsi été créés pour combler ce défaut (**Moo**, **Moose**, **Mouse**, etc.). **Cor** est une tentative dirigée par [Curtis Ovid Poe](https://gist.github.com/Ovid) d’inclure ces fonctionnalités dans le cœur de Perl. La spécification est collaborative sur son [Gist GitHub](https://gist.github.com/Ovid/68b33259cb81c01f9a51612c7a294ede). Plus d’infos : - [wiki](https://github.com/Ovid/Cor/wiki) ; - [comparaison de syntaxe avec Moose](https://github.com/Ovid/Cor/wiki/Cookbook) ; - [première implémentation (proto)](https://github.com/stevan/Cor). ## Nouveau livre de briand d foy Pour celles et ceux qui ne connaissent pas, le cadriciel Web [Mojolicious](https://www.mojolicious.org/) est une véritable pièce de maître qui n’a rien à envier aux *Django, RoR, Flask ou ChoisissezCeQueVousVoulez*. C’est d’ailleurs bien plus qu’un framework web… Plutôt un framework de développement. Par exemple, la prochaine version majeure de [Bugzilla](https://www.bugzilla.org/) sera notamment [réécrite avec](https://dylan.hardison.net/2020/02/09/bugzilla-project-updates-2020/) . **Mojolicious** est un travail communautaire initié par [Sebastian Riedel](https://twitter.com/kraih?lang=fr) (OpenSuse) qui était également le créateur du cadriciel [Catalyst](http://www.catalystframework.org/) (cadriciel Web MVC). Un membre très reconnu de la communauté Perl [brian d foy](https://en.wikipedia.org/wiki/Brian_d_foy) (_sic_) a écrit un livre sur les [clients Web écrits avec Mojolicious](https://leanpub.com/mojo_web_clients). ![mojolicious](https://i.imgur.com/8J7DWtr.png) ## Nouveau livre : compilation d’articles techniques Sortie de [The best of Perl Hacks](https://perlschool.com/the-best-of-perl-hacks) par **Dave Cross**. C’est une sorte de recueil de billets de blogs sélectionnés (comme furent en leurs temps les « _Best of Perl Journal_ » qui étaient en plusieurs volumes !). **Dave Cross** est un expert du largage Perl et il a tenu pendant des années un blog technique. Il a décidé de sélectionner les meilleurs articles des dix dernières années pour les compiler dans un livre. ## Nouveau livre pour débutants Perl Sortie du nouveau livre _[Perl Taster: Your First Two Hours With Perl](https://perlschool.com/books/perl-taster)_, toujours par Dave Cross. Ce livre cible les débutants en Perl. ## Perl School Les trois livres vus précédemment font partie de [PerlSchool](https://perlschool.com) qui est une sorte de « maison d’édition indépendante de livres dématérialisés ». D’autres livres sont sortis (moins récemment) sous le giron de PerlSchool : - _[Selenium and Perl](https://perlschool.com/books/selenium-perl)_, par **John Davies** ; - _[Cucumber and Perl](https://perlschool.com/books/cucumber-and-perl)_, par **John Davies** ; - _[Learning Perl excercises](https://perlschool.com/books/learning-perl-exercises)_, par **brian d foy**. ## Pilote officiel mongodb abandonné Après avoir fait grincer des dents la communauté open source dans son ensemble avec son changement de licence vers SSPL (on en a d’ailleurs parlé dans [un journal sur LinuxFr.org](https://linuxfr.org/users/spack/journaux/sspl-all-your-service-are-belong-to-us)), MongoDB s’est mis une partie des développeurs Perl à dos en [abandonnant son pilote officiel pour Perl](https://metacpan.org/pod/MongoDB#END-OF-LIFE-NOTICE). Ceux qui travaillaient avec MongoDB en Perl ne vont pas le regretter, car le pilote n’était de toute façon souvent pas à jour et une implémentation non officielle (module pure-perl Mango) existait déjà. L’ancien dev de l’implémentation pure Perl du pilote MongoDB [Mango](https://metacpan.org/pod/Mango) ([Sebastian Riedel](https://metacpan.org/author/SRI)… encore lui !) a répondu à cette nouvelle par un cinglant « bon débarras ». Par le passé, il avait déjà rapporté que le développement de mango **était un calvaire** car [MongoDB ne lui fournissait pas l’aide nécessaire et qu’il était obligé de lire le code des pilotes officiels dans d’autres langues](https://www.reddit.com/r/perl/comments/cvuyko/the_mongodb_perl_driver_is_being_deprecated). Si vous utilisiez ou envisagiez d’utiliser MongoDB parce que… c’est un peu « _hype_ », un conseil donc, FUYEZ ! ## Sortie de Tau Station Tau Station est selon son équipe de développement un **jeu en mode texte massivement multijoueur dans un navigateur**. Il est décrit en français dans ce [billet de blog](https://blog.kharec.info/post/mmorpg-tau-station/) de [Sandro Cazzaniga](https://blog.kharec.info). Il est gratuit… Allez tester cette pépite : [TauStation](https://taustation.space/) ![Tau Station](https://i.imgur.com/MHCwdhJ.png) ## PullRequestClub Suite au défunt **CPAN Pull Request Challenge**, une autre équipe a mis en place le [PullRequestClub](https://pullrequest.club/hello). C’est un site Web ([code source](https://github.com/kyzn/PRC)) qui consiste à encourager les développeurs à faire des _pull requests_ en mettant en relation mainteneurs gentils avec développeurs motivés. Je trouve que ça ressemble un peu dans l’esprit à [Hacktoberfest](https://hacktoberfest.digitalocean.com). ![PullRequestClub](https://i.imgur.com/FclmGks.png) ## PerlWeeklyChallenge Les développeurs Perl ont toujours aimé s’amuser en programmant avec des petits défis (Perl golf, japhs, poésie Perl, code obfusqué…). ![Image regex golf](https://imgs.xkcd.com/comics/regex_golf_2x.png)  _xkcd ([lien](https://xkcd.com/1313/)) — Licence CC BY‑NC_ Une compétition amicale a été mise en place récemment et connaît un grand succès, il s’agit du [PerlWeeklyChallenge](https://perlweeklychallenge.org) ! Cette initiative qui propose des challenges d’algorithmique en Perl ou Raku (ou parfois d’autres langages) a clairement marqué l’année 2019. Cette initiative, orchestrée de main de maître par [Mohammad Anwar](https://github.com/manwar) (de _[Perl Weekly](https://perlweekly.com/)_) consiste à remplir des petits « défis » hebdomadaires. Un seul mot pour terminer sur ce sujet… **Un grand merci Mohammad !** ## Cnext [cnext](https://next-cpan.github.io/cnext/) est un nouveau **client CPAN**. L’approche de ce client est différente de [cpanminus](https://metacpan.org/pod/App::cpanminus) ou [cpm](https://github.com/skaji/cpm) car il ne cible pas l’architecture des serveurs **CPAN** mais GitHub. L’index est dans un dépôt github ([pause-index](https://github.com/pause-play/pause-index)). Plus d’infos sur l’index dans la [doc de next-indexes](https://github.com/next-cpan/next-indexes). À noter que cpanminus utilise aussi un index alternatif [metaDB](https://cpanmetadb.plackperl.org) et qu’il en existe plusieurs autres. **cnext** n’est aujourd’hui pas encore fonctionnel. ## Perl 5 => Perl, Perl 6 => Raku 2019 a également connu le renommage de Perl 6 en Raku. Je n’en dis pas plus, on y reviendra peut-être dans une dépêche dédiée (?) (***need help***). ## Nouvel installeur de l’interpréteur perl (en bash) Parmi les `perlbrew`, `plenv` etc. voici un petit nouveau : [perl-install](https://github.com/skaji/perl-install). L’idée étant d’implémenter l’installeur en `bash` pour pouvoir installer sur des machines ne disposant pas de Perl. Perl est partout me direz-vous… Oui mais après l’annonce d’Apple de ne pas fournir les interpréteurs pour `ruby`, `python` et `perl` dans leur OS de base, c’est potentiellement un nouveau besoin d’avoir un installeur dans un langage encore supporté. ## Toujours plus de Continuous Integration Perl En plus des vénérables travis, circle ci, appveyor, gitlab ci, l’année 2019 a vu fleurir quelques github actions pour perl : [installer avec cpm](https://github.com/marketplace/actions/install-with-cpm), [installer avec cpanminus](https://github.com/marketplace/actions/install-with-cpanm), [environement Perl](https://github.com/marketplace/actions/setup-perl-environment) et [Perl Critic](https://github.com/marketplace/actions/github-action-for-perl-critic) Les images officielles pour perl : [dockerhub Perl](https://hub.docker.com/_/perl) J’en profite pour placer quelques liens vers des helpers (GitHub actions ou d’autres infrastructures) : - [helpers Gitlab](https://gitlab.com/rsrchboy/perl-ci) - [helpers Travis](https://github.com/travis-perl/helpers) - [helpers GitHub houseabsolute](https://github.com/houseabsolute/ci-perl-helpers) ou encore [helpers GitHub cip](https://github.com/plicease/cip) ## Audrey Tang [Audrey Tang](https://en.wikipedia.org/wiki/Audrey_Tang) est une membre respectée et programmeuse géniale qui a eu beaucoup d’influence sur **Perl** et **Raku**. Elle occupe depuis quelques années un poste de ministre à Taïwan. C’est une personnalité au parcours atypique et précoce : elle fut la plus jeune ministre sans portefeuille de Taïwan et elle travaille notamment sur le développement de logiciels libres dans le domaine social et le domaine de l’accès du public aux données. Parmi ses travaux notables, on trouve [Pugs](https://fr.wikipedia.org/wiki/Pugs) et [EtherCalc](https://fr.wikipedia.org/wiki/EtherCalc) (et pas mal d’autres comme [Module::Install](https://metacpan.org/pod/Module::Install), des contributions à [Request Tracker](https://bestpractical.com/request-tracker) vu plus haut, [SVK](https://fr.wikipedia.org/wiki/SVK_(logiciel)), [PAR](https://metacpan.org/pod/PAR), [Slash](https://en.wikipedia.org/wiki/Slash_(software)) etc.) # Développement de Perl ## Releasing flow Pour le releasing flow en général, se référer à la [dépêche sur Perl 5.30.0](https://linuxfr.org/news/sortie-de-perl-5-30-0#toc-autres-versions-de-perl) qui détaille plus les notions comme **blead**, **pumpking** ou encore le **schéma de versioning**. Perl 5.30.0 a été [publié en mai 2019](https://www.nntp.perl.org/group/perl.perl5.porters/2019/05/msg254844.html) et le *pumpking* était **Sawyer X**. Pour Perl 5.32.0, pas de changement, le mainteneur en chef reste le même mais les mainteneurs de versions de développement varient d’où [cet appel à volontaires en début de cycle de développement](https://www.nntp.perl.org/group/perl.perl5.porters/2019/05/msg254848.html). Ensuite durant une année, des versions de développement (version perl **5.impair.sousversion**) sont publiées chaque mois. L’intégration de code dans la branche de développement passe des tests de compilation (**github action** dans le dépôt, matrice d’options `configure`, `make`, `make test`) et des « smoke tests » (des tests dans des VMs). Enfin, après chaque sortie de version de developpement, un rapport de test de la **« rivière CPAN »** (ensemble de **3000 modules CPAN** dont beaucoup d’autres modules dépendent) est exécuté et sert également pour vérifier les non-régressions. Il n’y a pas de date de sortie décidée pour la version stable, donc elle sort quand elle est prête. Lors du développement de perl 5.30.0, les versions de dev s’étaient arrêtées à `5.29.10`, cette fois les versions de dev s’étalent un tout petit peu plus (`5.31.11`). En mars **Sawyer X** a décidé de [décaler la 5.31.11 d’une semaine](https://www.nntp.perl.org/group/perl.perl5.porters/2020/04/msg257359.html) et de [faire une nouvelle version de dev et de décaler d’un mois la sortie de la version stable](https://www.nntp.perl.org/group/perl.perl5.porters/2020/04/msg257375.html). Finalement il n’y aura pas eu de `5.31.12` mais une `5.32.0-RC0` le 30 mai. Voici une frise représentative des versions : ![Versions](https://i.imgur.com/TO27yLN.png) ------ ## Précédentes dépêches sur les sorties des versions de Perl - [Sortie de Perl 5.10](https://linuxfr.org/news/sortie-de-perl-5100) en 2007. - [Sortie de Perl 5.12](https://linuxfr.org/news/perl-512-une-constante-jeunesse) en 2010. - [Sortie de Perl 5.14](https://linuxfr.org/users/jbbourgoin/journaux/sortie-de-perl-5140) en 2011. - [Sortie de Perl 5.16](https://linuxfr.org/news/perl-5-16-0) en 2012. - [Sortie de Perl 5.18, 5.20 et 5.22](https://linuxfr.org/news/sortie-de-perl-5-22-0) (5.18 en 2013, 5.20 en 2014, 5.22 en 2015). - [Sortie de Perl 5.24, 5.26, 5.28 et 5.30](https://linuxfr.org/news/sortie-de-perl-5-30-0) (5.24 en 2016, 5.26 en 2017, 5.28 en 2018, 5.30 en 2019). # CHANGELOGS **Perl 5.32.0** est sorti le 20 juin ([annonce](https://www.nntp.perl.org/group/perl.perl5.porters/2020/06/msg257547.html)). Place maintenant aux différents **CHANGELOG** ou **perldelta** qui n’ont pas été traités sur **LinuxFR**. # Sortie de Perl 5.30 La version **5.30.0** a déjà été traitée dans la [dépêche sortie de perl 5.30](https://linuxfr.org/news/sortie-de-perl-5-30-0), on passe donc directement à la version suivante qui est la *version patch* **5.30.1**. ## 5.30.1 ### Mise à jour des modules - Seulement **Module::Corelist** qui contient la liste des modules (autant dire aucun changement) ### Compilation - Un correctif concernant **OpenBSD**, **FreeBSD** et **Solaris** qui concerne la macro `ECHO` lorsqu’on souhaite utiliser `dtrace`. Le configure de Perl ne définit pas correctement cette variable, mais elle est généralement définie par le `make` du système. Pour avoir le problème, il faut être par exemple sur une **Solaris** et configurer avec `-Dusedtrace`. Le correctif se trouve dans le `Makefile.SH`. - Les tests de ***locale*** sont en erreur sur Windows à cause d’un double bogue (côté Windows). La solution pour corriger a été de faire plus de conversions en Perl et de laisser moins de travail à Windows. ### Corrections #### Groupes effectifs Un correctif sur le setter de la variable ```$)``` (si on a les privilèges de le faire). La variable **$)** permet d’accéder aux **effective groups**. Par exemple : `perl -e "print $)"` Nous donnera : `1000 4 24 27 30 46 116 126 999 1000 1001` Et pour info voici la sortie de `id` : ```bash uid=1000(johndoe) gid=1000(johndoe) groups=1000(johndoe),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare),999(docker),1001(usb) ``` Parmi les autres variables en Perl pour accéder à ce type d’infos (et qu’on peut utiliser pour potentiellement baisser les privilèges) : - `$<`, identifiant utilisateur réel ; - `$>`, identifiant utilisateur effectif ; - `$(`, identifiant de groupe réel ; - `$)`, identifiant de groupe effectif (on vient d’en parler). #### Autres - Correction d’un bogue avec `readline` qui évalue en contexte de liste alors qu’il n’attend qu’une seule valeur de retour. La fonction `readline` en Perl permet de jouer avec les _handles_ de fichiers (`my $line = ` est équivalent à `my $line = readline(STDIN);`) - Un bogue mystérieux avec la gestion des signaux et **sv_gets** - Une fuite de mémoire lorsqu’on essaye de faire une correspondance d’expression rationnelle entre une chaîne non explicitement marquée **UTF‑8** et un caractère Unicode. Le cas d’exemple est `"a" =~ /\N{U+2129}/ while 1;` et le code voit qu’il y a un problème de correspondance, mais il manque un retour de fonction. - Correction d’un débordement de tampon (_buffer overflow_) lorsqu’on se sert de précision négative `sprintf("%.*a", -10000, $x)` (pourquoi faire ça ?) - correction d’un bogue sur l’appel de `scalar` et le multidéréférencement qui posait un problème d’assertion dans l’étape de compilation. ## 5.30.2 ### Compilation #### MYMALLOC Le build de `MYMALLOC` sur Windows a été corrigé. *MYMALLOC* est l’implémentation Perl de `malloc`. On peut l’utiliser si on donne `-Dusemymalloc` à `Configure` : ``` /* This file contains Perl's own implementation of the malloc library. * It is used if Configure decides that, on your platform, Perl's * version is better than the OS's, or if you give Configure the * -Dusemymalloc command-line option. */ ``` #### Autres - prise en charge de **GCC 10** ! ### Corrections #### printf %n Correction d’un bogue avec le **très spécial** format **%n** de `printf` et `sprintf`. D’habitude on utilise `printf` pour afficher et formater un argument dans une chaîne, mais là c’est différent et on va pouvoir stocker l’emplacement dans la chaîne pour le stocker dans un argument. D’après la [doc de sprintf](https://perldoc.perl.org/functions/sprintf.html) : `%n special: *stores* the number of characters output so far into the next argument in the parameter list` Voici un exemple : ```perl perl -e 'printf("123 %n 456 -> ", $count); print $count;' ``` va produire ``` 123 456 -> 4 ``` Le bogue était lié à l’utilisation conjointe de `%n` et d’**UTF‑8** (produisant une mauvaise valeur) avec un Perl ayant l’option de débogage activée (dans ce cas Perl se mettait à paniquer). Et pendant qu’on y est : `Don’t fall into the trap of using a printf when a simple print would do. The print is more efficient and less error prone.` #### Autres - Correctif d’une fuite mémoire après une refactorisation des classes de caractères dans les expressions rationnelles (`m/[...]/`). Le problème a été introduit en **5.26**. Ce correctif est marqué comme candidat à être répercuté sur des versions correctives de **5.26** et **5.28** - correction d’un bogue dans les [propriétés Unicode](https://perldoc.pl/perluniprops) `qr/\p{nv:qnan}/`. `\p{...}` introduit une propriété Unicode. Ici de la forme `\p{nom:valeur}`. `nv` est un [double](https://perldoc.pl/perlguts#Formatted-Printing-of-IVs,-UVs,-and-NVs) et donc ça veut dire « _Numeric Value is Not a Number_ ». Il s’agissait d’un ***heap buffer overflow*** - Correction d’une **assertion failure** dans les expressions rationnelles avec *script run* (`(sr:...)` incomplets. - Une limitation de l’exécution de code récursif dans les expressions rationnelles (`(?{ code })` et `(??{ code })`) est mieux gérée. En effet, le code profondément récursif émettait un _warning_. Le correctif consiste à n’appliquer la limitation plus qu’à `(??{ code })` (évalue le retour du code embarqué). ## 5.31.1 ### Améliorations du cœur de Perl - Interdiction d’utiliser `vec` et les opérations `bitwise` sur les caractères Unicode après `0xff`. Ça ne fait aucun sens, car ce sont des opérations bit à bit et les codes au‑delà de 0xff sont représentés en UTF‑8. - `Sys::Hostname::hostname()` n’accepte plus d’argument (déprécié depuis **5.28**) ### Mise à jour des modules #### Storable Mise à jour de [Storable](https://perldoc.pl/Storable) pour régler un problème de clone. **Storable** est un module qui permet de sérialiser et faire persister les structures de données Perl de façon rapide, compacte (binaire) et portable. Le bogue est tiré par les cheveux, il faut combiner *affaiblissement de référence* + *expression rationnelle compilée dans une variable* + *autovivication* + *clone en profondeur*. Comme ceci : ```perl my $foo = [qr//,[]]; weaken($foo->[1][0][0] = $foo->[1]); dclone $foo; ``` #### Autres - Correction sur le module **IO**. La fonction **sendto** n’utilisait pas la « to » et donc ignorait l’adresse paire - **Pod::Parser** est supprimé du core mais reste évidemment accessible grâce au **CPAN** ### Compilation - Le script **autodoc.pl** a été fortement remanié - Fin du support du build pour **Windows CE** ### Corrections #### Sub Zero Une parenthèse fermante fallacieuse (sans ouvrante correspondante) pouvait poser problème dans un **sub parse**. Un ***sub parse*** est une analyse dans une expression rationnelle comme `my $str =~ s/(41)/$1+1/e` qui va remplacer 41 par 42 avec une analyse de ```$1+1``` pour faire ```41+1=42```. Ce comportement est activé par le modificateur `/e` (_evaluate_). Le problème c’était, qu’en interne, des parenthèses étaient parfois ajoutées dans la construction de l’arbre pour aider l’analyseur, et la parenthèse fermante pouvait alors interférer. La solution est d’ajouter un symbole *virtuel* qui ne peut pas être écrit dans le source. #### Autres - Un correctif dans **PerlIO** concernant les descripteurs de fichier et la fonction `close` - Comme documenté ```%{^CAPTURE_ALL}``` est a présent un alias de ```%-``` et non ```%+``` (erreur) - Un autre bogue sur `%{^CAPTURE}` et `@{^CAPTURE}`. Comme vous le savez peut‑être (pas) en Perl `$var` est différent de `@var` qui est différent de `%var`. Le _hash_ `%{^CAPTURE}` était vide si l’on avait appelé `@{^CAPTURE}` avant (et inversement). - Correction d’un _integer overflow_ sur des valeurs extrêmement grandes de nombres à virgule flottante (pas grand en taille mais en nombre de chiffres après la virgule). Le correctif consiste à tester la taille. - Mauvais analyse lexicale des `0x` ou `0b` incomplets (sans rien après). `print -e 'print 0x - 1'` produit `1` … - Le **sub parsing** a été également amélioré en règle générale pour accepter plus de choses qui sont acceptées par le *parsing standard* - Correction d’un bogue dans l’affectation des références de code (`\&f1 = \&f2`) dans le _package_ par défaut (`main::`). ## 5.31.2 ### Améliorations du cœur de Perl #### Total annihilation Il existe une variable d’environnement [PERL_DESTRUCT_LEVEL](https://perldoc.pl/perlhacktips#PERL_DESTRUCT_LEVEL) qui permet de forcer l’interpréteur à libérer à la fin de son exécution tout ce qu’il a alloué, ce qui permet de simuler en quelque sorte la [gestion mémoire par région](https://fr.wikipedia.org/wiki/Gestion_de_m%C3%A9moire_par_r%C3%A9gions) (et d’éviter les fuites de mémoires). Lorsque cette variable n’est pas définie, Perl laisse le soin à `exit` de faire ce travail. L’amélioration consiste à prendre en compte cette variable même lorsque l’interpréteur n’a pas été compilé en mode débogage. #### Autres - Nouvelle erreur **No digits found for %s literal** lorsqu’on écrit en base hexa (`0x…`) ou binaire (`0b…`) quelque chose qui n’est pas de l’hexa ou du binaire - Meilleure gestion de la propagation des signaux critiques dans les `eval` - Correction d’un bogue dans les blocs `CHECK`, `BEGIN`, etc., il s’agit d’un problème de gestion d’`exit`. - De nombreuses fonctions récursives pour parcourir l’arbre des opérateurs pendant la compilation ont été déroulées, ça permet d’être moins agressif avec la pile (perf ?). ### Compilation - Support de [Bison](https://www.gnu.org/software/bison/) (le générateur d’analyseur syntaxique) versions **3.1** jusqu’à **3.4** - Correction mineure du Configure avec `clang`. - `-Duse64bitint` devient la valeur par défaut si on compile sur **VMS** - Problème de compilation avec **VC++ 6.0** qui ne sera pas corrigé, car le support va être arrêté. ### Corrections - Des corrections en lien avec l’amélioration de la gestion des signaux dans les `eval`, la gestion des `0x…` et `0b…` et les `exit` dans les blocs d’**INIT** - Correction concernant les ouvertures de fichiers temporaires `open my $fh, ">>+", undef` ; la correction de ce bogue est ce qui a cassé la compilation **VC++6** - Correction d’une erreur de segmentation mémoire (**SEGV**) avec le déréférencement multiple (récursive) dans les expressions rationnelles (avec `*`, par exemple) ## 5.31.3 ### Améliorations du cœur de Perl #### Range et conversions implicites L’opérateur `range` gère mieux les conversions implicites. L’opérateur range est `..` et il permet de faire des choses simples comme ```perl print 1..10 ``` qui va générer une liste de 1 à 10 : ``` 12345678910 ``` Ou il peut faire des choses comme ```perl "ab".."ba" ``` qui va donner ``` ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba ``` Dans le cas de ```"0"".."-1"```, on générait avant une liste de 0 jusqu’à 99 et maintenant ça sera une liste vide. #### Keep the stuff left `\K` est à présent interdit dans les assertions _lookbehind_ et _lookahead_ car : 1. le comportement est cassé : 2. personne ne peut dire quel est le comportement attendu. `\K` est **"Keep the stuff left of the \K, don't include it in $&"** Matcher sans garder. C’est déjà en soi un `lookbehind`, l’inclure dans un autre `lookbehind` était donc tiré par les cheveux. #### Autres - Nouvelle fonction `parse_subsignature()` qui permet d’aller plus loin dans l’implémentation des signatures - De nouvelles macros pour gérer de manière sécurisée le changement de locale (qui nécessite souvent l’acquisition d’un mutex) - Optimisation de l’allocation des structures internes pendant l’analyse : la taille d’une entrée dans l’inventaire pour l’allocation de structure d’opérateur est réduite de **8 bits** par opérateur sur les machines **64 bits** ### Corrections #### Propagation des exceptions Correction de la propagation des signaux lorsque ```$@``` est forcé à une valeur numérique. Normalement ```$@``` contient le message d’erreur de l’exception. `perl -e 'eval { die }; print $@'` nous donne `Died at -e line 1.`. Le problème c’est que dans le cas où on veut propager (donc une exception après une autre exception), une valeur numérique dans `$@` est ignorée. ```perl perl -e '$@ = 100; die' ``` donne ``` Died at -e line 1. ``` Or on voudrait quelque chose comme ```perl perl -e '$@ = "100"; die' ``` qui donne ``` 100 ...propagated at -e line 1. ``` donne ``` Died at -e line 1. ``` #### Exception en lecture seule, l’histoire sans fin Un correctif sur un problème *« amusant »*. Lorsqu’on met la variable ```$@``` en read only et qu’une exception se déclenche, perl veut écrire dans ```$@``` qui est read-only, ce qui génère une exception qui veut écrire dans `$@` qui… vous avez compris le problème… …Et ça se finissait en débordement de pile. #### Autres - Encore une correction sur les `0b…` et `0x…` ## 5.31.4 ### Améliorations du cœur de Perl - Une amélioration pour les développeurs qui consiste à pouvoir séparer les étapes de compilation et d’optimisation des expressions rationnelles compilées (`qr/.../`). Il faut avoir compilé Perl en mode débogage. ### Compilation - Amélioration du script `Configure` pour la détection de `clang` et **C++**. ### Corrections - correction d’une fuite mémoire dans les reconnaissances d’expressions rationnelles avec une chaîne de caractères UTF‑8 ; - encore du travail sur `0x` et `0b`, décidément ! ## 5.31.5 ### Améliorations du cœur de Perl - Les variables modifiables ne sont plus autorisées en contexte de constante. Ça signifie que `my $var; $sub = sub () { $var };`, qui était déprécié depuis **5.22**, produit à présent une erreur si `$var` est modifié dans une autre partie du code (il faut ajouter un **return**). - Documentation des piles internes de l’interpréteur Perl - Documentation mise à jour pour utiliser HTTPD quand c’est possible - Nettoyage et mise à jour des vieux liens sur les courriels, etc. - Changements purement internes : ajout d’index pour garder l’ancienne position dans des piles Perl, des arguments en plus dans des macros en relation avec **UTF‑8** ### Compilation - Amélioration de Configure concernant `d_u32align` (défaut à oui, car la question n’est posée que sur machine 32 bits) et `malloc_usable_size` ## 5.31.6 ### Améliorations du cœur de Perl #### Script runs Les **script run** ne sont plus expérimentales. Un ***script run*** n’est probablement pas ce que vous pensez. En fait, il s’agit de contrôler que toute la séquence de caractères appartient au même **script Unicode**. On peut écrire souvent les mêmes choses visuellement pour l’humain mais à partir d’un ensemble différent de caractères Unicode. C’est assez critique car ça peut mener à du [spoofing d’url](https://en.wikipedia.org/wiki/Spoofed_URL). Une expression rationnelle dans un script _run_ va vérifier que tout ce qui est lu fait partie du même script. #### Autres - Les assertions alpha ne sont plus expérimentales. Il s’agit des **assertions** d’expressions rationnelles du type ***lookbehind*** et ***lookahead*** qui sont **non capturantes** (_cf._ [doc](https://metacpan.org/pod/release/WOLFSAGE/perl-5.31.8/pod/perlre.pod#Lookaround-Assertions)) - La vérification des fonctionnalités est plus rapide - Perl a migré vers [GitHub](https://github.com/Perl/perl5) (pas vraiment une amélioration du cœur de Perl, mais bon à noter). Cela comprend le dépôt Git et le système de suivi de bogues. Les rapports de bogue liés à la sécurité se font toujours en privé. - Un TRÈS gros travail a été fait sur le **lexer**. Un gros réusinage d’une très grosse fonction de 4 100 lignes avec un découpage en de multiples fonctions. Le résultat sera plus facile à comprendre et maintenir. - Le code qui gère la **translitération** (`tr///`) a été retravaillé entièrement avec de nombreux bogues corrigés (Unicode, `/s`, autres). ### Mise à jour des modules - Un nouvel outil **streamzip** a été ajouté. Il permet de zipper ce qui est envoyé a l’entrée standard. ### Compilation - Correction d’un bogue dans `Configure` avec **GCC 10** ### Corrections - Une concaténation multiple entre une fonction mal définie et des chaînes lève bien un avertissement. ## 5.31.7 ### Améliorations du cœur de Perl - Introduction du nouvel opérateur `isa`. Ça doit parler aux programmeurs Perl puisque depuis looongtemps il existe un module `UNIVERSAL` qui contient cette méthode et permet de faire de l’orienté objet. Mais voilà, là il s’agit d’ajouter un opérateur à Perl et non une méthode. - Une propriété utilisateur dans un bloc de nom Unicode `\p{...}` sera toujours prioritaire par rapport à une propriété Unicode du même nom. - L’outil `perlbug` qui sert à faire des rapports de bogues a été mis à jour pour pointer vers le [système de suivi de GitHub](https://github.com/Perl/perl5/issues). ### Mise à jour des modules - Le module **B::Debug** va bientôt sortir du cœur de Perl mais restera disponible dans le CPAN évidemment. C’est un module purement technique pour **deparser** et comprendre comment notre programme est interprété par **perl** #### VStrings Mise à jour de **Storable** avec un correctif interdisant les **vstring** de plus de deux gibioctets. Mais au fait, qu’est‑ce qu’une `vstring` ? Aucun rapport avec des chaînes qui serviraient à stocker des versions pour du _semantic versioning_. C’est une façon d’écrire les chaînes de caractères en donnant leurs codes et en séparant par des `.` (points). Avec des **vstring**, on écrit par exemple `v1.11;` qui est la même chose que `chr(1) . chr(11)`. Ça peut produire des résultats surprenants car dans un contexte de comparaison de chaînes (`eq`), les chaînes `v1.11` et `v1.2` sont différentes, mais dans un contexte de comparaison numérique (`==`) `v1.1` et `v1.2` seront évaluées en `0` et donc la comparaison sera vraie. `perl -e 'print v1.2+0'` donne `0` tout comme `perl -e 'print v1.1+0'` donne `0` ```perl my $a = v1.11; my $aa = chr(1) . chr(11); my $b = v1.2; my $bb = chr(1) . chr(2); print "a == b\n" if ($a == $b); print "a ne b\n" if ($a ne $b); print "a == aa\n" if ($a == $aa); print "a eq aa\n" if ($a eq $aa); ``` Qui nous donnera : ``` a == b # v1.11 == v1.2 a ne b # v1.11 ne v1.2 a == aa # v1.11 == chr(1) . chr(11) a eq aa # v1.11 eq chr(1) . chr(11) ``` ### Compilation - Correction pour la compilation sur **Solaris** avec **Oracle Developer Studio compiler** ### Corrections - Correction **mymalloc** (déjà abordé) sur **Windows** - Pas vraiment un bogue, mais dans la doc Unicode, certains exemples fantaisistes étaient censés utiliser une propriété Unicode « bateau » qui n’existe pas, mais avec le temps certaines ont fini par apparaître. :) La doc a été mise à jour et les valeurs fautives remplacées par des noms qui ne devraient cette fois vraiment jamais exister. - Correction d’un bogue concernant les modificateurs d’expression rationnelles `/i` (insensible à la casse) et `/l` (locale forcée). - Problème dans les tests avec `make minitest`. C’est un jeu de tests exécuté avec `miniperl`, qui est un interpréteur `perl` capable de lire et d’exécuter du code Perl avant l’étape d’inclusion des interfaçages **XS**. Il est proposé d’étendre les « _smoke tests_ » à cette cible pour éviter d’ignorer involontairement ce problème. - Ajout d’une solution de contournement pour corriger un [bogue dans glibc sur le changement de locales](https://bugs.debian.org/931139). ## 5.31.8 ### Améliorations du cœur de Perl - Tout comme pour `malloc` mentionné plus tôt, perl propose une autre implémentation de `strlen` appelé `my_strlen` mais cette fois destinée aux systèmes ne disposant pas pas de `strlen`. L’implémentation de `my_strlen` a été optimisée. - D’autres améliorations de performances sur les fonctions `grok_*`. Les fonctions **grok** sont des [fonctions de conversion](https://perldoc.pl/perltoc#Numeric-functions). ### Documentation - La documentation ne conseille plus d’utiliser le `malloc` de Perl. On part du principe que les implémentations modernes de malloc sont meilleures à présent. - La documentation sur **XS** (interfacage avec code C) suggère aussi d’utiliser **FFI** (autre implémentation plus dynamique) - **Eat your own dog food** en quelque sorte : les exemples dans la doc **perlipc** sont à présent valides avec `use warnings; use strict;` - Documentation des fonctions **grok** ### Compilation - Rajout d’includes (`` et ``) à certaines sondes configurées pour rendre le code plus portable (éviter une erreur de compilation) - Correction de la compilation de Perl sur **NetBSD 8.0** avec **g++**. - Configure plus flexible sur **Solaris**, ce qui permet de compiler sur une plus grande variété de configurations **Solaris**. ### Corrections - Correction d’un débordement de pile (_heap overflow_) dans ce genre d’expression rationnelle : `q0=~/0|\p{__::Is0}/`. L’origine du bogue est le fait que les soulignés vont produire en interne plusieurs noms pour la même propriété et le code confondait les deux noms. - Correction d’un _assertion failed_ sur les groupes non capturants dans les expressions rationnelles. Pour rappel, un groupe non capturant, `(?:...)`, et un exemple d’expression rationnelle qui crée cette _assertion failed_ : `/(?:0)|(?:)(?:[1-9])/` - La fonction de translittération `tr///` a été beaucoup retouchée en **5.31** et une régression est apparue lorsqu’on utilise le modifier `/d`. Ce modificateur est un modificateur interne qui permet de simuler un set de caractère ancien (et problématique). - Correction d’un comportement défensif dans la gestion du comptage des références (gestion de la mémoire de Perl). Il s’agissait de ne pas décrémenter le nombre de références d’un objet si on s’apprête à mettre quelque chose dedans. - **IO.xs** devient thread safe ## 5.31.9 ### Améliorations du cœur de Perl - prise en charge d’**Unicode 13** et de nouvelles propriétés Unicode - On dispose d’un nouvel alias pour les noms Unicode (mais attention, [on ne peut pas faire les mêmes choses avec l’un ou avec l’autre](https://perldoc.pl/5.31.10/perlunicode#Comparison-of-%5CN%7B...%7D-and-%5Cp%7Bname%3D...%7D)) - Arrêt de la prise en charge de **POSIX::mbstowcs** et **POSIX::wcstombs**. Spécification cassée, aucune demande pour ces fonctions (les versions non sécurisées sans « s » restent supportées) - mise à jour des liens pointant vers `search.cpan.org` vers `metacpan.org` ### Compilation - Sur **VMS**, avec la publication d’un _patch kit_ récent, de nombreuses nouvelles fonctions sont accessibles (dans `stdint.h`) et donc utilisées par `perl`. ### Corrections #### require n’aime pas local %INC Un correctif sur la valeur de retour de `require` (un équivalent de `use` qui s’exécute à l’exécution plutôt qu’à la compilation). Le bogue se produit lorsqu’on **localise** le hash des includes `%INC`, donc lorsqu’on déclare un `%INC` `local`. Qu’est‑ce que `local` par rapport a `my` ? Une variable déclarée avec `my` est visible dans le `bloc` donc `{ ... }`. On dit qu’elle est **lexicale**. Une variable déclarée avec `local` est visible dans l’arbre d’appel. ```perl my $out = "out"; { sub pin() { print "[pin] in = $in\n"; } my $in = "in"; print "[block] in = $in\n"; # Affiche in print "[block] l = $l\n"; # Affiche rien lout(); pin(); # Affiche rien } print "[out] out = $out\n"; # Affiche out print "[out] in = $in\n"; # Affiche rien sub lout() { local $l = "local"; lin(); } sub lin() { print "[lin] l = $l\n"; # Affiche local } ``` #### Autres - Correction d’un bogue sur les expressions rationnelles imbriquées qui produisent ***exceeded limit in regex***. - En mode débogage, la compilation de propriétés Unicode pouvait produire certaines informations étranges, c’est corrigé. ## 5.31.10 ### Améliorations du cœur de Perl - On peut à présent inclure des expressions rationnelles dans les noms Unicode, par exemple `r!\p{na=/(SMILING|GRINNING) FACE/}!` #### Opérateurs chaînes Une comparaison chaînée comme `$a < $b < $c` se comporte comme `$a < $b && $b < $c` donc en deux temps, mais la valeur de `$b` n’est pas recalculée (cas d’une variable *attachée* à une fonction instable par exemple). Plus d’infos dans la [doc](https://perldoc.pl/5.31.10/perlop#Operator-Precedence-and-Associativity). Également, on ne pourra pas faire `1 .. 6 .. 9` car l’opérateur `..` n’est pas associatif. Un petit fil de discussion sympa sur le sujet montre que le problème n’est [pas tout à fait tranché](https://github.com/Perl/perl5/issues/17692). ## 5.31.11 La version **5.31.11** est une rc, elle est livrée par **Sawyer X** (qui est le pumpking actuel des versions majeures de Perl). **blead** est gelée. **5.31.11** sert de base pour corriger les points bloquants avant **5.32.0** Un peu avant la sortie de perl **5.32.0**, voici a quoi ressemble la « liste de points bloquants » : ![Points bloquants](https://i.imgur.com/UbaT9UG.png) ## 5.32.0-RC0 Sortie de la RC0 le 30 mai 2020 ([annonce](https://www.nntp.perl.org/group/perl.perl5.porters/2020/05/msg257486.html)). ## 5.32.0-RC1 Sortie le 7 juin 2020 ([annonce](https://www.nntp.perl.org/group/perl.perl5.porters/2020/06/msg257521.html)). ## 5.32.0 Voici donc l’[annonce de la sortie de Perl 5.32.0](https://www.nntp.perl.org/group/perl.perl5.porters/2020/06/msg257547.html), que nous avons disséqué en long en large dans cette dépêche. :) \o/ Tadaaa ! ## Conclusion Pour terminer, juste une image pour remercier votre courage/abnégation d’avoir lu/scrollé jusqu’ici :) J’espère pour vous que vous n’avez pas lu cette dépêche à haute voix… ![Lire du Perl à voix haute invoque Cthulhu](https://i.imgur.com/FHWOH8V.png)