tag:linuxfr.org,2005:/tags/perl5/publicLinuxFr.org : les contenus étiquetés avec « perl5 »2024-03-18T10:39:03+01:00/favicon.pngtag:linuxfr.org,2005:Diary/410992024-03-15T23:19:35+01:002024-03-16T07:50:10+01:00Hackathon Perl / Open Food Facts à Paris les samedi 23 et dimanche 24 mars 2024Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Hello,</p>
<p>En association avec les <a href="https://www.mongueurs.net/">mongueurs</a> Nous proposons d’organiser un Hackathon (marathon de programmation) autour de l’utilisation de <a href="https://www.perl.org/">Perl</a> dans le projet <a href="https://fr.openfoodfacts.org">Open Food Facts</a>.</p>
<p>Open Food Facts est un peu le Wikipedia de l'alimentation: la plus grande base de données ouvertes sur l'alimentation.</p>
<p>Développeurs, vous êtes invités à vous joindre à nous pour faire avancer le logiciel qui permet à 3M° de visiteurs par mois de faire des choix plus informés pour leur santé et le bien de la planète.</p>
<p>Une participation partielle ou à distance est possible.</p>
<p><a href="https://forum.openfoodfacts.org/t/hackathon-perl-open-food-facts-in-paris/530">Plus de détails en suivant ce lien</a>.</p>
<div><a href="https://linuxfr.org/users/alexg/journaux/hackathon-perl-open-food-facts-a-paris-les-samedi-23-et-dimanche-24-mars-2024.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/135132/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/alexg/journaux/hackathon-perl-open-food-facts-a-paris-les-samedi-23-et-dimanche-24-mars-2024#comments">ouvrir dans le navigateur</a>
</p>
Alex G.https://linuxfr.org/nodes/135132/comments.atomtag:linuxfr.org,2005:Bookmark/67052023-06-24T14:12:25+02:002023-06-24T14:12:25+02:00PERL 5.38 est dans Fedora<a href="https://fedoraproject.org/wiki/Changes/perl5.38">https://fedoraproject.org/wiki/Changes/perl5.38</a> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/131670/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/gilcot/liens/perl-5-38-est-dans-fedora#comments">ouvrir dans le navigateur</a>
</p>
Gil Cot ✔https://linuxfr.org/nodes/131670/comments.atomtag:linuxfr.org,2005:News/410022022-09-28T19:06:08+02:002022-09-28T19:06:08+02:00Perl 5.36.0 est sortiLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>La toute dernière version de Perl, la 5.36.0, est sortie le 28 mai 2022. Vous la retrouverez bientôt dans votre distribution préférée.</p>
<p>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, suivent également ce même traitement. Perl est inclus dans la quasi-totalité des distributions GNU/Linux.</p>
<p>Tout d’abord un petit lien vers la précédente dépêche sur la <a href="//linuxfr.org/news/sortie-de-perl-5-32-0">sortie de Perl 5.32.0</a> ainsi que vers la dépêche annonçant la <a href="//linuxfr.org/news/sortie-de-perl-5-30-0">sortie de Perl 5.30.0</a>.</p>
</div><ul><li>lien nᵒ 1 : <a title="https://fr.wikipedia.org/wiki/Perl_(langage)" hreflang="fr" href="https://linuxfr.org/redirect/110568">Perl (wikipedia)</a></li><li>lien nᵒ 2 : <a title="https://www.nntp.perl.org/group/perl.perl5.porters/2022/05/msg263783.html" hreflang="en" href="https://linuxfr.org/redirect/110572">Annonce de Perl 5.36.0</a></li><li>lien nᵒ 3 : <a title="https://perldoc.perl.org/perl5360delta" hreflang="en" href="https://linuxfr.org/redirect/110605">Changelog Perl 5.36.0</a></li><li>lien nᵒ 4 : <a title="https://rjbs.cloud/blog/2022/05/perl-5.36/" hreflang="en" href="https://linuxfr.org/redirect/110606">Changelog commenté</a></li><li>lien nᵒ 5 : <a title="https://www.perl.org/" hreflang="en" href="https://linuxfr.org/redirect/110607">Site officiel Perl</a></li></ul><div><h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li>
<ul>
<li>
<a href="#toc-am%C3%A9liorations-de-base">Améliorations de base</a><ul>
<li><a href="#toc-le-bundle-536-d%C3%A9sactive-la-fonctionnalit%C3%A9-indirect">Le bundle 5.36 désactive la fonctionnalité « indirect »</a></li>
<li><a href="#toc-le-bundle-536-d%C3%A9sactive-la-fonctionnalit%C3%A9-multidimensional">Le <em>bundle</em> 5.36 désactive la fonctionnalité « multidimensional »</a></li>
</ul>
</li>
<li><a href="#toc-largument-de-ligne-de-commande--g">L’argument de ligne de commande <code>-g</code></a></li>
<li><a href="#toc-prise-en-charge-dunicode-140">Prise en charge d’Unicode 14.0</a></li>
<li><a href="#toc-les-ensembles-de-regex-ne-sont-plus-consid%C3%A9r%C3%A9s-comme-exp%C3%A9rimentaux">Les ensembles de regex ne sont plus considérés comme expérimentaux</a></li>
<li><a href="#toc-le-lookbehind-de-longueur-variable-nest-g%C3%A9n%C3%A9ralement-plus-consid%C3%A9r%C3%A9-comme-exp%C3%A9rimental">Le lookbehind de longueur variable n’est généralement plus considéré comme expérimental</a></li>
<li>
<a href="#toc-sigfpe-nest-plus-diff%C3%A9r%C3%A9"></a><a href="https://www.gnu.org/software/libc/manual/html_node/Program-Error-Signals.html">SIGFPE</a> n’est plus différé</li>
<li><a href="#toc-suivi-de-bool%C3%A9en-stable">Suivi de booléen stable</a></li>
<li><a href="#toc-it%C3%A9ration-sur-plusieurs-valeurs-%C3%A0-la-fois-exp%C3%A9rimental">Itération sur plusieurs valeurs à la fois (expérimental)</a></li>
</ul>
</li>
</ul>
<h3 id="toc-améliorations-de-base">Améliorations de base</h3>
<p>Comme toujours, <code>use v5.36;</code> active les fonctionnalités pour cette version de Perl. Le <em>bundle</em> 5.36 permet la fonctionnalité « signatures ». Introduite dans la version 5.20.0 de Perl et modifiée plusieurs fois depuis, la fonctionnalité de « signatures » de sous-programmes n’est désormais plus considérée comme expérimentale. Elle est considérée comme une fonctionnalité de langage stable et n’affiche plus d’avertissement.</p>
<pre><code class="perl"><span class="k">use</span> <span class="nn">v5</span><span class="mf">.36</span><span class="p">;</span>
<span class="k">sub</span> <span class="nf">add</span> <span class="p">($x, $y) {</span>
<span class="k">return</span> <span class="nv">$x</span> <span class="o">+</span> <span class="nv">$y</span><span class="p">;</span>
<span class="p">}</span></code></pre>
<p>Malgré cela, certains éléments des sous-programmes signés restent expérimentaux ; voir ci-dessous.</p>
<p>Le <em>bundle</em> 5.36 active aussi la fonctionnalité <code>isa</code>. Introduite dans la version 5.32.0 de Perl, cet opérateur est resté inchangé depuis. L’opérateur est désormais considéré comme une fonctionnalité de langage stable. Pour plus de détails, vous pouvez lire <a href="https://metacpan.org/release/RJBS/perl-5.36.0/view/pod/perlop.pod#Class-Instance-Operator">la documentation de l’opérateur</a>.</p>
<h4 id="toc-le-bundle-536-désactive-la-fonctionnalité-indirect">Le bundle 5.36 désactive la fonctionnalité « indirect »</h4>
<p>L’utilisation d’appels de méthode « indirects » est très puissante et permet d’émuler des constructions comme <code>$x = new Class;</code>. </p>
<p>D’un autre côté, cette possibilité <a href="https://www.effectiveperlprogramming.com/2020/06/turn-off-indirect-object-notation/">complique le travail de l’interpréteur</a> en rendant de nombreuses erreurs détectable uniquement à l’exécution. C’est ce qui fait de la désactivation de cette fonctionnalité un « mal pour un bien » et donc une amélioration.</p>
<h4 id="toc-le-bundle-536-désactive-la-fonctionnalité-multidimensional">Le <em>bundle</em> 5.36 désactive la fonctionnalité « multidimensional »</h4>
<p>L’utilisation d’une expression de liste comme clé de hachage pour simuler des tableaux multidimensionnels clairsemé</p>
<p>Les détails de ces changements peuvent être trouvés dans la documentation de Perl-5.36.0 mais la version courte est : c’est un peu comme avoir <code>use strict;</code> activé, les fonctionnalités qui causent plus de problèmes que de solutions sont désactivées. De plus, ajouter <code>use 5.36;</code> dans votre code activera également les avertissements comme si vous aviez écrit <code>use warnings;</code></p>
<p>Enfin, avec cette version, la fonctionnalité expérimentale <code>switch</code>, présente dans chaque <em>bundle</em> de fonctionnalités depuis leur introduction dans la v5.10, a été supprimée du <em>bundle</em> v5.36. Si vous souhaitez l’utiliser (contre l’avis des développeurs du langage), vous devrez l’activer explicitement.</p>
<p>Ricardo Signes a annoncé le 28 mai 2022 des exceptions avec des blocs <code>finally</code>, des blocs <code>defer</code>, des boucles <code>for</code> avec plusieurs variables d’itération, Unicode 14 et une nouvelle classe de fonctions d’assistance importées via le pragma 'builtin'.</p>
<h3 id="toc-largument-de-ligne-de-commande--g">L’argument de ligne de commande <code>-g</code>
</h3>
<p>Un nouvel argument de ligne de commande, <code>-g</code>, est disponible. C’est un alias plus simple pour <code>-0777</code>.</p>
<p>Cet argument est utile pour les “one-liners” car il permet de lire un fichier en entier plutôt que ligne par ligne.</p>
<p>Par exemple un fichier <code>data</code>:</p>
<pre><code>foo
bar
baz
</code></pre>
<p>Pourra être lu en une seule fois avec <code>-0777</code> ou <code>-g</code>:</p>
<pre><code class="bash">$ cat data <span class="p">|</span> perl -g -e <span class="s1">'while (<>) { chop; print "[$_]"; }'</span>
<span class="o">[</span>foo
bar
baz<span class="o">]</span></code></pre>
<p>Attention, cet argument change également le comportement d’autres fonctionnalités (comme <code>chomp</code>).</p>
<h3 id="toc-prise-en-charge-dunicode-140">Prise en charge d’Unicode 14.0</h3>
<p>Comme toujours, cette version de Perl améliore le support d’Unicode. Vous pouvez lire <a href="https://www.unicode.org/versions/Unicode14.0.0/">Unicode® 14.0.0</a> pour plus de détails. On pourra par exemple utiliser l’émoji <a href="https://unicode.org/emoji/charts-14.0/emoji-released.html#1f9cc">“troll”</a> et ce, même si on n’est pas vendredi.</p>
<h3 id="toc-les-ensembles-de-regex-ne-sont-plus-considérés-comme-expérimentaux">Les ensembles de regex ne sont plus considérés comme expérimentaux</h3>
<p>Avant cette version, la fonctionnalité des ensembles de regex (officiellement appelée <a href="https://perldoc.perl.org/perlrecharclass#Extended-Bracketed-Character-Classes">“Extended Bracketed Character Classes”</a>) était considérée comme expérimentale. Introduite dans la version 5.18.0 de Perl et modifié plusieurs fois depuis, elle est désormais considérée comme une fonctionnalité stable du langage et son utilisation n’affiche plus d’avertissement. Les personnes intéressées pourront lire la <a href="https://metacpan.org/dist/perl/view/pod/perlrecharclass.pod#Extended-Bracketed-Character-Classes">documentation de la fonctionnalité</a>.</p>
<h3 id="toc-le-lookbehind-de-longueur-variable-nest-généralement-plus-considéré-comme-expérimental">Le lookbehind de longueur variable n’est généralement plus considéré comme expérimental</h3>
<p>Avant cette version, toute forme de lookbehind de longueur variable était considérée comme expérimentale. Avec cette version, le statut expérimental a été réduit pour ne couvrir que le lookbehind qui contient des parenthèses de capture. En effet, il n’est pas clair si <code>“aaz”=~/(?=z)(?<=(a|aa))/</code> doit correspondre et laisser $1 égal à “a” ou “aa”. Actuellement, il correspondra à l’alternative la plus longue possible, “aa”. Bien que nous soyons convaincus que la construction globale ne correspondra désormais que lorsqu’elle le devrait, nous ne sommes pas sûrs de conserver le comportement actuel de “correspondance la plus longue”.</p>
<h3 id="toc-sigfpe-nest-plus-différé">
<a href="https://www.gnu.org/software/libc/manual/html_node/Program-Error-Signals.html">SIGFPE</a> n’est plus différé</h3>
<p>Les exceptions à virgule flottante sont maintenant livrées immédiatement, de la même manière que les autres “défauts” -comme les signaux tels que SIGSEGV. Cela signifie que l’on a au moins une chance d’attraper un tel signal avec un gestionnaire <code>$SIG{FPE}</code>, par exemple pour que la fonction <code>die</code> puisse signaler la ligne en perl qui l’a déclenché.</p>
<h3 id="toc-suivi-de-booléen-stable">Suivi de booléen stable</h3>
<p>Les valeurs booléennes “true” et “false”, souvent accessibles par des constructions comme <code>!!0</code> et <code>!!1</code> (idiomatique n’est-ce pas?), en plus d’être renvoyées par de nombreuses fonctions et opérateurs de base, se souviennent désormais de leur nature booléenne même via l’affectation à des variables. La nouvelle fonction <code>is_bool()</code> vient rejoindre les <a href="https://perldoc.perl.org/builtin">builtins</a> et peut servir à vérifier si une valeur est de nature booléenne. Cela est susceptible d’être utile lors de l’interopérabilité avec d’autres langages ou de la sérialisation de type de données, entre autres.</p>
<h3 id="toc-itération-sur-plusieurs-valeurs-à-la-fois-expérimental">Itération sur plusieurs valeurs à la fois (expérimental)</h3>
<p>Vous pouvez désormais itérer sur plusieurs valeurs à la fois en spécifiant une liste de lexiques entre parenthèses. Par exemple:</p>
<pre><code class="perl"><span class="k">for</span> <span class="k">my</span> <span class="p">(</span><span class="nv">$key</span><span class="p">,</span> <span class="nv">$value</span><span class="p">)</span> <span class="p">(</span><span class="nv">%hash</span><span class="p">)</span> <span class="p">{</span> <span class="o">...</span> <span class="p">}</span>
<span class="k">for</span> <span class="k">my</span> <span class="p">(</span><span class="nv">$left</span><span class="p">,</span> <span class="nv">$right</span><span class="p">,</span> <span class="nv">$gripping</span><span class="p">)</span> <span class="p">(</span><span class="nv">@moties</span><span class="p">)</span> <span class="p">{</span> <span class="o">...</span> <span class="p">}</span></code></pre>
<p>Avant Perl v5.36, essayer de spécifier une liste après <code>for my</code> donnait une erreur de syntaxe. Cette fonctionnalité est actuellement expérimentale et entraînera un avertissement de catégorie <code>experimental::for_list</code>. Pour plus de détails, voyez-la <a href="https://metacpan.org/dist/perl/view/pod/perlsyn.pod#Compound-Statements">documentation associée</a>.</p>
</div><div><a href="https://linuxfr.org/news/perl-5-36-0-est-sorti.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/127656/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/perl-5-36-0-est-sorti#comments">ouvrir dans le navigateur</a>
</p>
Emmanuel Seymancontra-shPatrick TrauquesèguestisaacBruno EthvignotEllendhelGil Cot ✔palm123https://linuxfr.org/nodes/127656/comments.atomtag:linuxfr.org,2005:Bookmark/51472022-09-15T12:24:14+02:002022-09-15T12:40:23+02:00This is not your grandfather’s Perl<a href="https://stackoverflow.blog/2022/09/08/this-is-not-your-grandfathers-perl/">https://stackoverflow.blog/2022/09/08/this-is-not-your-grandfathers-perl/</a> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/128768/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/gilcot/liens/this-is-not-your-grandfather-s-perl#comments">ouvrir dans le navigateur</a>
</p>
Gil Cot ✔https://linuxfr.org/nodes/128768/comments.atomtag:linuxfr.org,2005:Bookmark/49292022-07-14T15:41:17+02:002022-07-14T15:41:17+02:00why PERL is still relevant in 2022?<a href="https://stackoverflow.blog/2022/07/06/why-perl-is-still-relevant-in-2022/">https://stackoverflow.blog/2022/07/06/why-perl-is-still-relevant-in-2022/</a> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/128300/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/gilcot/liens/why-perl-is-still-relevant-in-2022#comments">ouvrir dans le navigateur</a>
</p>
Gil Cot ✔https://linuxfr.org/nodes/128300/comments.atomtag:linuxfr.org,2005:Post/427872022-04-04T23:47:57+02:002022-04-04T23:55:42+02:00Perl - faire ressortir les définitions d'une liste de mots <p>Bonsoir, <br>
Débutante en perl cette année, nous devons fournir un projet prochainement. J'ai décidé de faire ressortir d'un texte français (si_c'est_un_homme.txt) tous les mots étrangers. Pour se faire, dans un premier script j'ai utilisé des expressions régulières qui testaient l'existence des mots du texte dans un dictionnaire français. Ce premier script m'a permis de sortir une liste ordonnée avec une seule occurence par mot > listemots.txt.</p>
<p>Dans un second script je souhaitais ouvrir cette liste ainsi qu'un second dictionnaire (les-100-mots-de-la-shoah) dans lequel les définitions des termes étrangers apparaissent entre guillemets. Seulement ce second script ne donne rien, pas même un message d'erreurs soulignant une faute à une quelconque ligne, juste rien. Pourriez-vous m'indiquer ce qui semblerait bloquer ?</p>
<p>Voici le code : avec beaucoup de commentaires :</p>
<pre><code class="perl"><span class="k">use</span> <span class="nn">strict</span><span class="p">;</span> <span class="c1"># mode algorithmique</span>
<span class="k">use</span> <span class="nn">warnings</span><span class="p">;</span> <span class="c1"># messages d'alerte</span>
<span class="k">use</span> <span class="nn">utf8</span><span class="p">;</span> <span class="c1"># caractères accentués dans le code Perl</span>
<span class="nb">binmode</span><span class="p">(</span><span class="bp">STDOUT</span><span class="p">,</span><span class="s">':utf8'</span><span class="p">);</span> <span class="c1"># caractères accentués dans le terminal </span>
<span class="c1">#OUVRIR LA LISTE DES MOTS contenu dans listemots.txt </span>
<span class="c1">#enregistrer ces mots dans une variable dans un tableau_</span>
<span class="k">my</span> <span class="nv">@liste</span> <span class="o">=</span> <span class="p">();</span>
<span class="nb">open</span><span class="p">(</span><span class="n">LST</span><span class="p">,</span><span class="s">'listemots.txt'</span><span class="p">);</span> <span class="c1">#ouvrir la liste des mots créée dans le précédent script perl</span>
<span class="nb">binmode</span><span class="p">(</span><span class="n">LST</span><span class="p">,</span><span class="s">':utf8'</span><span class="p">);</span>
<span class="k">while</span> <span class="p">(</span><span class="k">my</span> <span class="nv">$mot</span> <span class="o">=</span> <span class="o">\<</span><span class="n">LST</span> <span class="o">></span><span class="p">)</span> <span class="p">{</span>
<span class="nb">chop</span> <span class="nv">$mot</span><span class="p">;</span>
<span class="nb">push</span> <span class="p">(</span><span class="nv">@liste</span><span class="p">,</span> <span class="nv">$mot</span><span class="p">);</span> <span class="c1">#création d'une liste contenant ces mots dans le second script</span>
<span class="p">}</span>
<span class="nb">close</span><span class="p">(</span><span class="n">LST</span><span class="p">);</span> <span class="c1"># Si j'écris print ici : les mots de la liste s'affichent bien.</span>
<span class="nb">open</span><span class="p">(</span><span class="n">LST</span><span class="p">,</span> <span class="s">'les-100-mots-de-la-shoah.txt'</span><span class="p">);</span>
<span class="nb">binmode</span><span class="p">(</span><span class="n">LST</span><span class="p">,</span><span class="s">':utf8'</span><span class="p">);</span> <span class="c1"># caractères accentués dans le terminal</span>
<span class="k">while</span> <span class="p">(</span><span class="k">my</span> <span class="nv">$ligne</span> <span class="o">=</span> <span class="o">\</span><span class="sr"><LST></span><span class="p">)</span> <span class="p">{</span> <span class="c1">#traitement par ligne</span>
<span class="nb">chop</span> <span class="nv">$ligne</span><span class="p">;</span><span class="c1"># suppression du retour chariot</span>
<span class="k">foreach</span> <span class="k">my</span> <span class="nv">$mot</span> <span class="p">(</span><span class="nv">@liste</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$ligne</span> <span class="o">=~</span><span class="sr"> /$mot,\s"\s(.+?)\si"/</span><span class="p">)</span> <span class="p">{</span>
<span class="k">print</span> <span class="s">"»$ligne«\n"</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="nb">close</span> <span class="p">(</span><span class="n">LST</span><span class="p">);</span></code></pre>
<p><strong>PROBLEME</strong> : rien ne s'affiche (sauf les mots de la liste si j'écris print dans le premier tableau)</p>
<div><a href="https://linuxfr.org/forums/linux-debutant/posts/perl-faire-ressortir-les-definitions-d-une-liste-de-mots.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/127389/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/linux-debutant/posts/perl-faire-ressortir-les-definitions-d-une-liste-de-mots#comments">ouvrir dans le navigateur</a>
</p>
Amz163https://linuxfr.org/nodes/127389/comments.atomtag:linuxfr.org,2005:Post/427562022-03-13T21:48:30+01:002022-03-13T23:14:16+01:00Can't find string terminator "EOF" <p>Bonjour à tous,</p>
<p>Je m'exerce au PERL à travers la création d'un petit script pour mon serveur Nagios.<br>
J'ai l'erreur suivante :</p>
<pre><code> Can't find string terminator "EOF" anywhere before EOF at check_disque.pl line 15.
</code></pre>
<p>Mon script est le suivant : </p>
<pre><code class="perl"> <span class="c1">#!/usr/bin/perl</span>
<span class="c1">#=====================================================================</span>
<span class="c1"># Auteur : Admin</span>
<span class="c1"># Date : 13/03/2022</span>
<span class="c1"># But : plugin Nagios pour vérifier l'espace disque utilisé</span>
<span class="c1">#=====================================================================</span>
<span class="c1"># Module à utiliser</span>
<span class="k">use</span> <span class="nn">strict</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">warnings</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">Nagios::Plugin</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">feature</span> <span class="sx">qw(switch say)</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">Getopt::Long</span><span class="p">;</span>
<span class="c1"># Détails de l'écran d'aide</span>
<span class="k">my</span> <span class="nv">$help</span> <span class="o">=</span> <span class="o"><<</span><span class="n">EOF</span><span class="p">;</span>
<span class="n">Plugin</span> <span class="n">Nagios</span> <span class="n">pour</span> <span class="n">contr</span><span class="err">ô</span><span class="n">ler</span> <span class="n">l</span><span class="s">'espace disque</span>
<span class="s"> usage: $0 -w Warning --c Critical</span>
<span class="s"> Options:</span>
<span class="s"> -h, --help</span>
<span class="s"> L'</span><span class="err">é</span><span class="n">cran</span> <span class="n">de</span> <span class="n">l</span><span class="s">'aide</span>
<span class="s"> -w, --warning=INTEGER</span>
<span class="s"> Le seuil d'</span><span class="n">avertissement</span>
<span class="o">-</span><span class="n">c</span><span class="p">,</span> <span class="o">--</span><span class="n">critical</span><span class="o">=</span><span class="n">INTEGER</span>
<span class="n">Le</span> <span class="n">seuil</span> <span class="n">critique</span>
<span class="n">exemples:</span>
<span class="nv">$0</span> <span class="o">-</span><span class="n">w</span> <span class="mi">80</span> <span class="o">-</span><span class="n">c</span> <span class="mi">90</span>
<span class="n">EOF</span>
<span class="k">my</span> <span class="nv">$warning</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="k">my</span> <span class="nv">$critical</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="k">my</span> <span class="nv">$exit</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="c1"># Récupération des valeurs de paramètres</span>
<span class="k">my</span> <span class="nv">$result</span> <span class="o">=</span> <span class="n">GetOptions</span><span class="p">(</span>
<span class="s">"w|warning=i"</span><span class="o">=></span> <span class="o">\</span><span class="nv">$warning</span><span class="p">,</span>
<span class="s">"c|critical=i"</span> <span class="o">=></span> <span class="o">\</span><span class="nv">$critical</span><span class="p">,</span>
<span class="s">"h|help"</span> <span class="o">=></span> <span class="o">\</span><span class="nv">$help</span><span class="p">,</span>
<span class="p">);</span>
<span class="o">...</span></code></pre>
<p>Merci d'avance les perleux ! </p>
<div><a href="https://linuxfr.org/forums/programmation-perl/posts/can-t-find-string-terminator-eof.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/127174/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/programmation-perl/posts/can-t-find-string-terminator-eof#comments">ouvrir dans le navigateur</a>
</p>
Gogoudhttps://linuxfr.org/nodes/127174/comments.atomtag:linuxfr.org,2005:Bookmark/42812022-02-11T10:08:04+01:002022-02-11T10:08:04+01:00Learn Perl in 2022<a href="https://opensource.com/article/22/2/perl-cheat-sheet">https://opensource.com/article/22/2/perl-cheat-sheet</a> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/126889/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/vmagnin/liens/learn-perl-in-2022#comments">ouvrir dans le navigateur</a>
</p>
vmagninhttps://linuxfr.org/nodes/126889/comments.atomtag:linuxfr.org,2005:Post/418762021-02-14T16:21:08+01:002021-02-14T16:21:08+01:00tentatives de web scrapping sur page avec javascript <p>Bonjour,<br>
je suis sous UBUNTU18.04 donc avec un Perl 5.26<br>
je cherche à récupérer le contenu d'un tableau rempli par JavaScript. Les données changent quotidiennement et j'ai besoin d'avoir leur somme en fin de mois.</p>
<p>Pour m’entraîner, j'ai construit la page suivante <a href="https://x_lours.pagesperso-orange.fr/test_recup_javascript.html">test_recup_javascript.html</a> et je tente de lire la page finale (post JavaScript).<br>
j'ai essayé :<br>
LWP::UserAgent; (pas de gestion du JavaScript)<br>
WWW::Mechanize (); (pas de gestion du JavaScript)<br>
WWW::Mechanize::Firefox; (mais il manque MozRepl plugin de Firefox qui n'existe plus)<br>
WWW::Mechanize::Chrome; (mais il manque des bibliothèque qui ne fonctionnent qu'à partir de Perl 5.30)<br>
Web::Scraper; (qui me donne un contenu avant ajout par JavaScript)<br>
WWW::Scripter; (qui me dit qu'il y a une erreur de syntaxe dans la page</p>
<blockquote>
<p>couldn't get script <a href="https://s.gstat.orange.fr/lib/gs.js?12126:">https://s.gstat.orange.fr/lib/gs.js?12126:</a> 500 Can't connect to s.gstat.orange.fr:443 (certificate verify failed) at <a href="https://x_lours.pagesperso-orange.fr...avascript.html">https://x_lours.pagesperso-orange.fr...avascript.html</a> (generated HTML) at /usr/local/share/perl/5.26.1/HTML/DOM.pm line 496.<br>
SyntaxError: Expected semicolon, '}' or end of line but found ' bouton = ' at <a href="https://x_lours.pagesperso-orange.fr...avascript.html">https://x_lours.pagesperso-orange.fr...avascript.html</a>, line 38.<br>
pas compris)<br>
Scrappy; (qui me donne un contenu avant ajout par JavaScript)</p>
</blockquote>
<p>j'ai besoin d'aide pour trouver une librairie qui me donne la page affichée à l'écran utilisateur et pas son code source …</p>
<p>toute idée sera grandement appréciée</p>
<p>cordialement </p>
<div><a href="https://linuxfr.org/forums/programmation-perl/posts/tentatives-de-web-scrapping-sur-page-avec-javascript.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/123303/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/programmation-perl/posts/tentatives-de-web-scrapping-sur-page-avec-javascript#comments">ouvrir dans le navigateur</a>
</p>
x-lourshttps://linuxfr.org/nodes/123303/comments.atomtag:linuxfr.org,2005:Bookmark/25042021-01-11T13:49:04+01:002021-01-11T13:49:04+01:00Debunking Perl Myths<a href="https://www.linkedin.com/pulse/perl-myths-pritesh-ugrankar">https://www.linkedin.com/pulse/perl-myths-pritesh-ugrankar</a> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/122892/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/deuzene/liens/debunking-perl-myths#comments">ouvrir dans le navigateur</a>
</p>
deuzenehttps://linuxfr.org/nodes/122892/comments.atomtag:linuxfr.org,2005:Diary/394422020-11-13T15:51:50+01:002020-11-13T15:51:50+01:00Retour d'expérience sur les langages de programmationLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li>
<a href="#toc-petit-tour-dexp%C3%A9rience-sur-des-langages">Petit tour d'expérience sur des langages</a><ul>
<li><a href="#toc-ocaml">OCaml</a></li>
<li><a href="#toc-haskell">Haskell</a></li>
<li><a href="#toc-tcl-perl-python-raku">Tcl, Perl, Python, Raku</a></li>
<li><a href="#toc-common-lisp-racket">Common Lisp, Racket</a></li>
<li><a href="#toc-j">J</a></li>
<li><a href="#toc-coq">Coq</a></li>
<li><a href="#toc-go">Go</a></li>
<li><a href="#toc-rust">Rust</a></li>
</ul>
</li>
<li><a href="#toc-ce-quil-mest-rest%C3%A9-de-tout-%C3%A7a">Ce qu'il m'est resté de tout ça</a></li>
<li><a href="#toc-langages-que-jaimerais-creuser-un-peu-un-jour">Langages que j'aimerais creuser un peu un jour</a></li>
</ul>
<p>Ces derniers temps, j'apprends moins de langages nouveaux qu'il y a quelques années. Du coup, je me suis dit que c'était une occasion de faire le tour sur l'essentiel des langages que j'ai testés.</p>
<p>Dans ce journal, je fais un peu dans le classique du ceci ou cela m'a plu dans tel langage, telle autre chose ne m'a pas plu. Le tout est très subjectif, biaisé et reflète fortement les trucs que j'ai voulu faire avec ces langages. Mais bon, j'ai lu beaucoup d'articles de blog dans ce genre (enfin, en général sur un seul langage, ou L1 vs L2) et, même si ça n'aide pas souvent à découvrir le langage de nos rêves, ni à changer d'opinion ou à apprendre grand-chose sur un langage qu'on connait déjà, j'ai trouvé quand même ça souvent sympa à lire vite fait, même (voire surtout) quand mon ressenti est différent.</p>
<h2 id="toc-petit-tour-dexpérience-sur-des-langages">Petit tour d'expérience sur des langages</h2>
<h3 id="toc-ocaml">OCaml</h3>
<p><a href="https://fr.wikipedia.org/wiki/OCaml">OCaml</a> est le premier langage que j'ai appris ! (enfin, son prédécesseur Camllight initialement, le langage qui était utilisé qu'en prépas en France)</p>
<p>Les trucs que j'ai aimés :</p>
<ul>
<li>Compile vers du code natif assez efficace.</li>
<li>Typage expressif (<a href="https://fr.wikipedia.org/wiki/Type_alg%C3%A9brique_de_donn%C3%A9es">types algébriques</a>), mais pratique (<a href="https://fr.wikipedia.org/wiki/Inf%C3%A9rence_de_types">inférence de types</a>) et pas trop compliqué : langage abordable.</li>
<li>Mélange de code fonctionnel et impératif possible et plutôt facile.</li>
<li>Sympa pour manipuler des structures de données arborescentes. En particulier pour écrire des analyses ou transformations d'AST.</li>
<li>Documentation accessible en ligne de commande.</li>
</ul>
<p>Les trucs qui me laissent dubitatif :</p>
<ul>
<li>Des messages d'erreur qui se sont améliorés mais, le typage riche et l'inférence n'aidant pas, les erreurs ont toujours du mal à parler la langue des mortels.</li>
<li>Une syntaxe et un système de types pas trop compliqués, mais qui se compliquent ces dernières années : introduction des GADT (une sorte de types dépendants — en gros, des monstres surpuissants invoqués par des super héros) et les extensions de syntaxe ppx qui peuvent casser à chaque changement de version, entres autres; ça a du bon quand même.</li>
<li>La syntaxe : l'extension <a href="https://reasonml.github.io/">Reason</a> fait plus de modifications que strictement nécessaire, mais marquer clairement la fin des <em>pattern matching</em> et autres structures de contrôle (comme en Rust), ce serait déjà bien (après, des accolades ou un <code>end</code> comme en Coq ou Ruby, c'est du détail).</li>
<li>Pas besoin de préciser les bibliothèques utilisées en préambule de fichier.</li>
<li>Un nombre ok de bibliothèques tierces.</li>
</ul>
<p>Les trucs que j'ai moins aimés :</p>
<ul>
<li>Bibliothèque standard limitée, beaucoup de variantes de fonctions de base, mais peu au-delà (pas de compression, encodage, unicode, http). Au moins deux bibliothèques alternatives existent, mais elles résolvent surtout des soucis différents.</li>
<li>Exceptions, en particulier leur sur-utilisation dans la bibliothèque standard qui a conduit à l'introduction de variantes en <code>*_opt</code> renvoyant plutôt un type option, du genre <code>None</code> ou <code>Some x</code>, plutôt que <code>Not_found</code> (mais pas pour toutes les fonctions encore).</li>
<li>Manque de structures de contrôle impératives : pas de break, continue, return ; ça peut vite devenir gênant si on manipule beaucoup les tableaux (tableaux qui d'ailleurs gagneraient en ergonomie à être dynamiques).</li>
<li>Des fonctions non <a href="https://fr.wikipedia.org/wiki/R%C3%A9cursion_terminale">récursives terminales</a> (donc risque de débordement de pile) dans la bibliothèque standard qui ont conduit à plus de duplication avec l'introduction de fonctions récursives terminales équivalentes.</li>
<li>Les bibliothèques, à moins d'être très populaires, risquent d'être mal documentées : les types des fonctions, si on a de la chance une courte description pour chacune, parfois un exemple dans le README.</li>
<li>Certaines bibliothèques connues font dans l'ingénierie lourde (comme le framework <a href="https://ocsigen.org/home/intro.html">ocsigen</a>), pas toujours évident de trouver des alternatives plus simples et bien documentées.</li>
</ul>
<h3 id="toc-haskell">Haskell</h3>
<p><a href="https://fr.wikipedia.org/wiki/Haskell">Haskell</a> a des propriétés similaires à OCaml, à ceci près qu'il accueille avec joie la complexité. Plus amusant, mais plus frustrant aussi.</p>
<p>Les trucs que j'ai aimés :</p>
<ul>
<li>Compile vers du code natif assez efficace.</li>
<li>Typage expressif, inférence de type.</li>
<li>Comme OCaml, pratique pour la manipulation d'AST.</li>
<li>La bibliothèque [parsec](<a href="https://en.wikipedia.org/wiki/Parsec_(parser)">https://en.wikipedia.org/wiki/Parsec_(parser)</a> qui permet de parser en combinant des parseurs. Des alternatives dans d'autres langages ont vu le jour, mais parsec reste plus naturel (mais pas le plus performant par contre).</li>
</ul>
<p>Les trucs qui me laissent dubitatif :</p>
<ul>
<li>Les <a href="https://en.wikipedia.org/wiki/Monad_(functional_programming)">monades</a>, des abstractions qui permettent de structurer les programmes de façon générique. C'est utilisé dans parsec pour combiner naturellement des parseurs, par exemple. Les monades IO et ST permettent de faire de l'impératif de façon compliquée aussi. C'est aussi utilisé pour rendre certains tutoriels très abstraits.</li>
<li>Un système de types plus complexe que celui d'OCaml et qui rencontre plus tôt les limites de l'inférence. Et une pléthore d'extensions de langage optionnelles.</li>
<li>Des messages d'erreur pour initiés à cause du typage expressif et de l'inférence de types.</li>
<li>Une communauté intéressée par des concepts comme les monades, les flèches, les catégories, etc. Ça se reflète dans de nombreux tutoriels et échanges, tout comme dans les bibliothèques tierces. C'est plus dur de trouver des contenus qui font dans le pragmatique. Ce point devient positif si on est passionné par les concepts mentionnés, ou source de frustration autrement :-)</li>
<li>Je n'aime pas trop certains éléments de syntaxe : l'indentation significative, l'abondance d'opérateurs avec priorités et associativité variables.</li>
<li>Des préambules de fichier avec souvent une suite interminable d'imports de bibliothèques et un mélange d'imports avec noms qualifiés et non qualifiés.</li>
</ul>
<p>Les trucs que j'ai moins aimés :</p>
<ul>
<li>Compilation lente.</li>
<li>Possible mais difficile de faire de l'impératif : manipuler des tableaux est tout sauf agréable (par exemple pour représenter la carte dans un jeu, faire de la recherche de chemins, etc.).</li>
<li>Il faut utiliser une bibliothèque externe pour avoir des chaînes de caractères implémentées raisonnablement.</li>
<li>Beaucoup de bibliothèques, mais c'est pas facile de s'y retrouver.</li>
<li>Beaucoup de bibliothèques font dans l'ingénierie lourde.</li>
<li>Beaucoup de bibliothèques ont un arbre conséquent de dépendances. </li>
<li>Beaucoup de bibliothèques sont mal documentées.</li>
</ul>
<p>Exemple personnel : recherche d'une bibliothèque pour gérer le xml. Première tentative, <a href="https://hackage.haskell.org/package/hxt">hxt</a> : pas moyen de trouver un indice dans la doc sur comment commencer (le théoricien remarquera que ça s'inspire de la <a href="https://fr.wikipedia.org/wiki/Morphisme">théorie des flèches</a>, mais ça l'aidera pas forcément tant que ça non plus). Deuxième tentative, <a href="https://hackage.haskell.org/package/HaXml-1.25.5/docs/Text-XML-HaXml.html">HaXml</a> : un peu moins abstrait peut-être, mais bon courage quand même. Troisième tentative, <a href="https://hackage.haskell.org/package/xml-1.3.14/docs/Text-XML-Light.html">Text-XML-Light</a>, le nom semble prometteur : pas d'exemples, mais ça semble en effet plus simple. Si l'on n'a pas encore capitulé, c'est le moment de chercher s'il n'y a pas un tutoriel à peu près à jour quelque part dans le wiki du langage pour une de ces bibliothèques.</p>
<p>Ceci dit, Haskell, c'est vraiment l'occasion de découvrir des concepts théoriques en faisant des trucs concrets, du genre découvrir à l'aide d'un framework web (appelé snap si ma mémoire est bonne) que les lentilles c'est pas seulement un truc qui se mange.</p>
<h3 id="toc-tcl-perl-python-raku">Tcl, Perl, Python, Raku</h3>
<p>Tous ces langages se ressemblent un peu : typage dynamique, bases faciles à apprendre, plus ou moins d'OO, communauté pragmatique avec des écosystèmes de packages très variés, langages pas super performants mais suffisamment dans beaucoup de cas. Du coup, je vais parler uniquement des choses marquantes qui m'ont semblé uniques à chacun.</p>
<p>Pour Perl :</p>
<ul>
<li>Intégration des expressions régulières dans le langage, inspirée de <a href="https://fr.wikipedia.org/wiki/Stream_Editor">Sed</a> : erreurs dans la regexp à la compilation, plein de fonctionnalités sur l'Unicode.</li>
<li>Mode de traitement de texte inspiré de <a href="https://fr.wikipedia.org/wiki/Awk">Awk</a> et adapté aux traitements rapides en ligne de commande.</li>
<li>Une documentation commode en ligne de commande et qui permet de démarrer vite, avec beaucoup d'exemples dans un style un peu « recettes » en synopsis.</li>
<li>Quelques incantations répétitives à écrire en début de chaque fichier.</li>
<li>Un peu plus fonctionnel (fonctions anonymes, portée lexicale des variables).</li>
<li>Mini typage statique partiel (scalaires vs tableaux vs tables de hachage, typos dans les noms de variables attrapées lors de la compilation).</li>
</ul>
<p>Pour Python :</p>
<ul>
<li>Beaucoup de bibliothèques dans le domaine du calcul scientifique (numpy, etc.).</li>
<li>Documentation plus OO que celle de Perl, plus orientée web que ligne de commande.</li>
<li>
<a href="https://fr.wikipedia.org/wiki/Liste_en_compr%C3%A9hension">Listes en
compréhension</a>
(perso, j'aime pas trop, ça se démarque un peu du reste du langage).</li>
</ul>
<p>Pour <a href="https://fr.wikipedia.org/wiki/Tool_Command_Language">Tcl</a> :</p>
<ul>
<li>Syntaxe où « tout est chaîne de caractères et commandes », mais fait proprement et sans pièges, contrairement au shell. Ça permet de faire des DSLs très naturels.</li>
<li>Par exemple, l'intégration très sympa avec SQLite : on peut écrire <code>db eval {SELECT uid FROM table WHERE n <= $max AND time < $epoch}</code> en mettant directement les variables <code>$max</code> et <code>$epoch</code> dans la requête sans risquer d'injections SQL (c'est pas de l'interpolation en fait). Ça évite la typique redondance où il faut passer les arguments à la requête après, souvent avec le même nom.</li>
<li>Plus fragile aux typos que Perl ou Python.</li>
<li>Intégration très naturelle avec Tk : mon langage préféré pour les petits GUI couplé à SQLite.</li>
<li>Documentation sous forme de pages de manuel proches de celles des outils en ligne de commande : plus formelle que la documentation Perl.</li>
<li>Wiki communautaire plein d'exemples, mais un peu chaotique.</li>
<li>Écosystème plus petit que les autres : pas idéal pour faire du calcul scientifique, par exemple, et moins de choix en général (par exemple pour faire du web).</li>
<li>Malgré son caractère de langage généraliste et bibliothèque standard assez vaste, Tcl peut être aussi facilement utilisé comme langage d'extension d'un programme en C (à la Lua).</li>
</ul>
<p>Pour <a href="https://fr.wikipedia.org/wiki/Raku_(langage)">Raku</a> (anciennement Perl 6) :</p>
<ul>
<li>Langage généraliste à tout faire très (trop ?) ambitieux et pas effrayé par la complexité.</li>
<li>Langage plutôt cohérent et orthogonal, inspiré de Perl (mais aussi Ruby et d'autres), mais plus OO dans l'esprit.</li>
<li>Les messages d'erreur sont plutôt sympas.</li>
<li>Les expressions régulières sont intégrées dans un concept plus vaste de grammaires, très pratique pour écrire des parseurs.</li>
<li>La VM se lance un peu lentement et les modules compilent pas vite non plus.</li>
<li>Les expressions régulières, qui sont quand même fondamentales dans ce langage, étaient encore très mal optimisées il y a un ou deux ans, la dernière fois que j'ai testé.</li>
<li>L'écosystème est assez jeune encore.</li>
</ul>
<h3 id="toc-common-lisp-racket">Common Lisp, Racket</h3>
<p><a href="https://fr.wikipedia.org/wiki/Common_Lisp">Common Lisp</a> et <a href="https://fr.wikipedia.org/wiki/Racket_(langage)">Racket</a> sont des langages fonctionnels, par défaut au typage dynamique, ils se prêtent très bien à la manipulation de structures arborescentes et sont très prisés pour leur extensibilité à l'aide de systèmes de macros évolués. Les deux ont pas mal de bibliothèques tierces et compilent vers du code assez efficace (normalement moins que OCaml ou Haskell, mais nettement plus que Python ou Perl).</p>
<p>Pour Racket :</p>
<ul>
<li>Une documentation plus propre, surtout pour les bibliothèques tierces. Pour tout dire, lorsque j'ai testé, j'étais émerveillé par <a href="https://docs.racket-lang.org/scribble/index.html">scribble</a>, leur langage de documentation, qui est un dialecte de racket lui-même et permet de faire plein de validations sur la doc, dont le fait que les exemples compilent et renvoient le bon truc.</li>
<li>Plus orienté fonctionnel, mais aussi plus académique : une partie de l'objectif du langage est d'illustrer les recherches en théorie des langages extensibles.</li>
<li>Démarrage plus lent de la VM.</li>
</ul>
<p>Pour Common Lisp :</p>
<ul>
<li>Macros plus simples, mais non <a href="https://en.wikipedia.org/wiki/Hygienic_macro">hygiéniques</a> (ce qui est pas cool par les temps qui courent).</li>
<li>Un peu plus fonctionnel, en particulier la construction extrêmement flexible <code>loop</code>, ou peut-être encore mieux, la bibliothèque <a href="https://common-lisp.net/project/iterate/">iterate</a> : une macro d'itération très extensible !</li>
<li>Un peu le bazar pour ce qui est des bibliothèques tierces : le gestionnaire de paquets lui-même, bien que fonctionnel, est considéré bêta depuis très très longtemps.</li>
</ul>
<p>Si l'on veut juste apprendre afin de découvrir les macros pour faire des DSLs, c'est bien plus simple de faire ça avec Tcl.</p>
<h3 id="toc-j">J</h3>
<p><a href="https://fr.wikipedia.org/wiki/J_(langage)">J</a> est un langage fonctionnel de manipulation vectorisée de tableaux multi-dimensionnels avec une syntaxe compacte faisant usage de primitives de haut niveau. C'est une variante moderne d'<a href="https://fr.wikipedia.org/wiki/APL_(langage)">APL</a> avec une syntaxe ASCII et plus de fonctionnalités.</p>
<p>Les trucs que j'ai aimés :</p>
<ul>
<li>La notation compacte est sympa pour expérimenter dans l'invite de commande.</li>
<li>Les primitives du langage sont très génériques et flexibles.</li>
<li>C'est amusant et ça fait réfléchir différemment à certains problèmes : je me suis amusé par exemple avec les problèmes du project euler, la génération de cartes et algos de dijkstra, ou l'écriture d'un automate pour parser des poèmes.</li>
</ul>
<p>Les trucs que j'ai moins aimés :</p>
<ul>
<li>Lorsqu'un algorithme ne se prête pas bien à une vectorisation, ça devient un casse-tête infernal.</li>
<li>J'ai beaucoup de mal à lire le code écrit par les autres.</li>
<li>De manière générale, j'ai l'impression que ce langage a tendance à facilement faire saturer ma mémoire cognitive de travail : un langage idéal pour quand j'ai besoin de me sentir idiot, ça marche à chaque fois.</li>
<li>Pour tout le code non algorithmique d'un projet, c'est aussi verbeux que n'importe quel langage et on ressent l'absence de structs/maps.</li>
</ul>
<p>Le langage est surtout utilisé en statistiques et calcul scientifique, mais je dois dire que si j'avais un besoin dans ce domaine, je chercherais plutôt du côté de Python, <a href="https://fr.wikipedia.org/wiki/R_(langage_de_programmation_et_environnement_statistique)">R</a> ou <a href="https://fr.wikipedia.org/wiki/Julia_(langage)">Julia</a>. J'utilise J parfois comme calculatrice. En pratique je me contente souvent de la calculatrice <code>dc</code> du standard POSIX :-)</p>
<h3 id="toc-coq">Coq</h3>
<p><a href="https://coq.inria.fr/">Coq</a> est un assistant de preuve et un langage purement fonctionnel que j'ai pas mal utilisé pendant la thèse dans le domaine de la compilation. Je suis resté simple utilisateur, assez ignorant des théories derrière et des techniques avancées d'automatisation de preuve. Il y a eu <a href="//linuxfr.org/news/sortie-de-coq-8-5-beta-un-assistant-de-preuve-formelle">une dépêche</a> ici il y a quelques années par des gens qui connaissent bien mieux le truc (perso, j'avais juste contribué avec un exemple).</p>
<p>Les trucs que j'ai aimés :</p>
<ul>
<li>C'est rigolo. Sérieusement, écrire des preuves de programme, c'est un peu comme un jeu, avec des moments de victoires épiques et de défaites accablantes.</li>
<li>C'est un langage avec un système de types extrêmement expressif : imaginez par exemple pouvoir écrire à l'aide du système de types qu'une passe d'optimisation d'un compilateur ne change pas la sémantique d'un programme et n'introduit donc pas de bugs inattendus !</li>
<li>Comme OCaml ou Haskell, le langage se prête bien à la manipulation d'AST et donc à l'écriture de compilateurs (avec des difficultés additionnelles ceci dit, comme le fait que les entiers sont représentés par un type algébrique et que Coq offre uniquement des structures de données purement fonctionnelles).</li>
</ul>
<p>Les trucs qui me laissent dubitatif :</p>
<ul>
<li>Écrire du code propre est relativement facile, mais des preuves propres, c'est une autre histoire : il y a l'approche où on essaie d'automatiser un maximum, ce qui demande de connaître très bien le langage de tactiques (donc preuve compréhensible par moins de monde), d'avoir une machine puissante (automatisation signifie plus de travail pour Coq) et compromettre la maintenabilité (du genre preuve qui passe plus avec la version suivante de Coq); il y a l'approche où on automatise pas trop et écrit beaucoup de lemmes intermédiaires et des preuves parfois répétitives, on insiste jusqu'à ce que ça passe à force de sentiments forts : je faisais partie des utilisateurs chevronnés de cette technique de jeu.</li>
</ul>
<p>Les trucs que j'ai moins aimés :</p>
<ul>
<li>Ça prend beaucoup de temps. Difficile de trouver des applications qui justifient cela, et ce même dans les domaines qui se prêtent assez bien à la preuve de programme (comme la compilation).</li>
<li>Il faut utiliser un autre langage, généralement OCaml, pour les parties non purement fonctionnelles du programme qui font de l'I/O.</li>
<li>C'est un langage complexe avec des messages d'erreur qui demandent une bonne expérience pour être appréhendés.</li>
<li>Faut pas s'attendre à trouver des contributeurs dans la nature : les programmeurs Coq se trouvent tous ou presque dans le domaine de la recherche.</li>
<li>Comme tout jeu, on finit par se lasser un peu à un moment et un jeu long dont on se lasse est un jeu qu'on ne finit pas (à moins d'être payé pour).</li>
<li>Les ressources disponibles dans la nature pour apprendre sont limitées, souvent écrites pour des gens qui font une thèse et sont intéressés par la théorie. La pratique et les astuces de preuve, faut les apprendre soi-même ou lors d'échanges avec les collègues si on a la chance d'être dans un environnement Coq. Bref, c'est peu accessible.</li>
</ul>
<h3 id="toc-go">Go</h3>
<p><a href="https://fr.wikipedia.org/wiki/Go_(langage)">Go</a> est un langage que j'utilise beaucoup ces derniers temps (frundis, jeux, des petits scripts), je suis plutôt satisfait.</p>
<p>Les trucs que j'ai aimés :</p>
<ul>
<li>Compile vers du code natif efficace. Compilation rapide, statique par défaut.</li>
<li>Langage : structures de contrôle impératives flexibles (for, switch, break, continue, labels de boucle), les essentiels du fonctionnel (fonctions de première classe et <a href="https://fr.wikipedia.org/wiki/Fermeture_(informatique)">clôtures lexicales</a>), l'essentiel de l'OO (structs, méthodes et interfaces, pas de classes), l'essentiel du typage statique (typage moyennement expressif, mais flexible au besoin et sans conversions implicites ni inférences trop génériques qui compliquent les messages d'erreur), l'essentiel des structures de données (maps et tableaux dynamiques, comme avec Perl, Python ou Ruby).</li>
<li>Une bibliothèque standard fournie, mais abordable et bien documentée.</li>
<li>Beaucoup de bibliothèques tierces bien documentées, souvent avec peu ou pas de dépendances.</li>
<li>Crosscompilation facile pour les programmes en pur Go (avec export en WebAssembly facile).</li>
<li>Programmation concurrente facile avec les channels et goroutines.</li>
<li>Un package, c'est tous les fichiers d'un dossier: pas besoin de faire un package différent pour éviter d'avoir trop de trucs dans un même fichier.</li>
<li>Documentation accessible en ligne de commande et, en général, langage pratique à utiliser dans un terminal avec plein d'outils (renommages, analyses statiques, bonne intégration vim/emacs, etc.).</li>
</ul>
<p>Les trucs qui me laissent dubitatif :</p>
<ul>
<li>URLs pour les noms d'import de package : ça conduit à devoir modifier le code si on change l'hébergement du projet. Ceci dit, le packaging n'a pas de solution magique non plus : j'ai beau ne pas vraiment aimer cette idée, c'est souvent pratique et pas clairement pire que les alternatives sur tous les points.</li>
<li>Absence de types génériques (<a href="https://go.googlesource.com/proposal/+/refs/heads/master/design/go2draft-type-parameters.md">en cours</a> d'être résolue, peut-être pour dans un an ou deux) : ça serait bien dans certains cas (bibliothèques génériques pour structures de données complexes ou opérations génériques sur des channels), mais ça me manque assez rarement tout compte fait (je ne ressens pas le besoin de remplacer les boucles <code>for</code> par des fonctions génériques, par exemple).</li>
<li>Plus verbeux qu'un langage dynamique, essentiellement du fait des signatures de fonctions (en pratique rentable dans un projet qui va au-delà du script, je trouve).</li>
</ul>
<p>Les trucs que j'ai moins aimés :</p>
<ul>
<li>Difficile parfois de faire du pur Go (GUI, SQLite, etc.) : l'avantage de la crosscompilation facile disparaît dans ce cas. C'est pas vraiment un point négatif, mais une annulation courante de point positif.</li>
</ul>
<h3 id="toc-rust">Rust</h3>
<p>Rust est un langage qui a pas mal de popularité en ce moment, <a href="//linuxfr.org/tags/rust/public">pas mal de trucs</a> sont passés sur linuxfr. J'ai lu un tutoriel, testé des exemples et lu de la doc, mais je n'ai jamais vraiment programmé avec, donc voici plutôt un retour d'apprentissage et d'utilisation :</p>
<ul>
<li>Des programmes très performants, dont le génial <a href="https://lib.rs/crates/ripgrep">ripgrep</a> qui remplace avantageusement grep.</li>
<li>Des programmes avec beaucoup de dépendances et qui mettent beaucoup de temps à compiler.</li>
<li>Langage d'inspirations multiples avec typage assez expressif (types somme et filtrage par motif similaires à OCaml), des <a href="https://en.wikipedia.org/wiki/Trait_(computer_programming)"><em>traits</em></a> (mais sans classes, un peu comme en Go).</li>
<li>Langage qui facilite l'impératif et le fonctionnel, même si l'absence de GC rend certaines pratiques de programmation fonctionnelle (comme une fonction qui renvoie une fonction) un peu alambiquées à écrire.</li>
<li>Un peu complexe à apprendre du fait de quelques notions assez subtiles (<a href="https://fr.wikipedia.org/wiki/Rust_(langage)#Possession_et_emprunt"><em>ownership</em>, <em>borrowing</em></a>) qui facilitent l'écriture de programmes concurrents <em>memory safe</em>, et du fait de l'ampleur du langage (macros, etc.).</li>
<li>Une documentation orientée web (même s'il me semble que j'avais trouvé un outil non officiel en ligne de commande).</li>
</ul>
<p>J'aimerais m'y mettre un jour, mais j'ai pas d'idée de projet personnel qui profite de l'absence de GC : un peu comme pour le C et le C++, avec la différence qu'avec ceux-ci je me suis déjà retrouvé à devoir lire voire modifier du code dans les programmes que j'utilise, et ça ne m'est pas encore arrivé avec du Rust.</p>
<h2 id="toc-ce-quil-mest-resté-de-tout-ça">Ce qu'il m'est resté de tout ça</h2>
<p>Au final, aujourd'hui, les seuls langages que j'utilise vraiment encore sont Go (pour un peu tout), Tcl (pour les GUIs et SQLite) et Perl (pour les petits scripts et <a href="https://fr.wikipedia.org/wiki/Comprehensive_Perl_Archive_Network">CPAN</a>). C'est sans compter des petits bouts de Javascript (dont j'ai pas parlé, car j'ai juste écrit des petits trucs en vanilla avec la doc de mozilla, sans aller chercher quoi que ce soit dans l'écosystème), ou les modifs de code C/C++ pour compiler sous OpenBSD, et mes tentatives le plus souvent couronnées d'échec pour compiler puis lancer du Java (dernière défaite cuisante en date : le jeu Mindustry qui est passé en dépêche il y a peu).</p>
<p>Ceci dit, même si au final on peut se dire à quoi bon avoir exploré autant de langages, j'ai bon souvenir de tout ça et ça influe probablement sur ma façon de programmer, j'espère qu'en bien :-)</p>
<h2 id="toc-langages-que-jaimerais-creuser-un-peu-un-jour">Langages que j'aimerais creuser un peu un jour</h2>
<p>Un langage relativement nouveau qui m'a l'air intéressant est <a href="https://www.nongnu.org/txr/">txr</a> : c'est en fait la combinaison de deux langages, un langage qui permet de capturer des motifs et parser facilement des documents, inspiré d'Awk, et un langage au style Lisp, mais différent. C'est pas un petit langage !</p>
<p>Dans le domaine des langages logiques, je trouve curieux <a href="https://fr.wikipedia.org/wiki/Mercury_(langage)">Mercury</a>, qui est un langage inspiré de <a href="https://fr.wikipedia.org/wiki/Prolog">Prolog</a> pour la partie logique, et Haskell pour la partie typage.</p>
<p>Pour ce qui est des langages concaténatifs, inspirés de <a href="https://fr.wikipedia.org/wiki/Forth_(langage)">Forth</a>, <a href="https://fr.wikipedia.org/wiki/Factor">Factor</a> semble être une approche moderne intéressante. Ceci dit, mes quelques lectures de tutos me donnent l'impression que mon cerveau ne gère pas bien l'approche concaténative de pile dès que ça devient un peu complexe (un peu la même sensation qu'avec J, mais pas aussi marquée).</p>
<p>J'ai vu passer assez souvent des articles sur le langage assez jeune mais plutôt actif <a href="https://en.wikipedia.org/wiki/Zig_(programming_language)">Zig</a>. Je me demande comment il se ressent en pratique par rapport au C voire au Rust ou C++.</p>
<div><a href="https://linuxfr.org/users/anaseto/journaux/retour-d-experience-sur-les-langages-de-programmation.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/122223/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/anaseto/journaux/retour-d-experience-sur-les-langages-de-programmation#comments">ouvrir dans le navigateur</a>
</p>
anasetohttps://linuxfr.org/nodes/122223/comments.atomtag:linuxfr.org,2005:News/398832020-07-04T15:18:55+02:002020-07-04T15:18:54+02:00Sortie de Perl 5.32.0Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p><a href="https://www.perl.org/">Perl</a> est un langage généraliste créé en 1987 par <a href="https://fr.wikipedia.org/wiki/Larry_Wall">Larry Wall</a>.</p>
<p>« <em>Perl continue de prospérer dans sa quatrième décennie grâce à une communauté d’utilisateurs et de développeurs très dynamique.</em> », <em>dixit</em> <a href="https://metacpan.org/pod/distribution/perl/pod/perldelta.pod#Acknowledgements">perldelta</a>. </p>
<p>Perl est distribué sous une double licence : <a href="https://opensource.org/licenses/Artistic-2.0">Artistic Licence</a> et <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPL v1+</a>. La plupart des modules du CPAN <a href="https://www.cpan.org/misc/cpan-faq.html#How_is_Perl_licensed">suivent également ce même traitement</a>.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f63616d6f2e67697468756275736572636f6e74656e742e636f6d2f303339633062373730666461666630663134313863356166613432393664666162613566323837352f36383734373437303733336132663266373236313737326536373639373436383735363232653633366636643266366237323631363936383266373036353732366332643732363137303734366637323266366436313733373436353732326636353738363136643730366336353265373036653637/68747470733a2f2f7261772e6769746875622e636f6d2f6b726169682f7065726c2d726170746f722f6d61737465722f6578616d706c652e706e67" alt="Perl 5 raptor" title="Source : https://camo.githubusercontent.com/039c0b770fdaff0f1418c5afa4296dfaba5f2875/68747470733a2f2f7261772e6769746875622e636f6d2f6b726169682f7065726c2d726170746f722f6d61737465722f6578616d706c652e706e67"> <em>« Perl 5 raptor » de <a href="https://github.com/kraih/perl-raptor">kraih</a>, licence <a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY‑SA 4.0</a></em></p>
<p>Tout d’abord un petit lien vers la précédente <a href="//linuxfr.org/news/sortie-de-perl-5-30-0">dépêche sur la sortie de Perl 5.30.0</a> qui explique en particulier le « <em>releasing flow</em> » et des termes spécifiques à la communauté Perl (<em>blead</em>, <em>pumpking</em>, etc.).</p>
</div><ul><li>lien nᵒ 1 : <a title="https://www.perl.org/" hreflang="en" href="https://linuxfr.org/redirect/106393">Perl</a></li><li>lien nᵒ 2 : <a title="https://metacpan.org/" hreflang="en" href="https://linuxfr.org/redirect/106394">MetaCPAN</a></li><li>lien nᵒ 3 : <a title="https://metacpan.org/pod/release/XSAWYERX/perl-5.32.0/pod/perldelta.pod" hreflang="en" href="https://linuxfr.org/redirect/106493">Perldelta 5.32.0 (dernier journal des modifications)</a></li></ul><div><h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li>
<a href="#toc-r%C3%A9trospective-de-2019-et-m%C3%AAme-un-peu-plus-morceaux-s%C3%A9lectionn%C3%A9s">Rétrospective de 2019 et même un peu plus, morceaux sélectionnés</a><ul>
<li><a href="#toc-les-perl-porters-migrent-vers-github">Les Perl porters migrent vers GitHub</a></li>
<li><a href="#toc-version-majeure-de-request-tracker">Version majeure de Request Tracker</a></li>
<li><a href="#toc-programmation-orient%C3%A9e-objet-native-bient%C3%B4t-int%C3%A9gr%C3%A9e-dans-le-c%C5%93ur-deperl">Programmation orientée objet native bientôt intégrée dans le cœur de Perl</a></li>
<li><a href="#toc-nouveau-livre-de-briand-d-foy">Nouveau livre de briand d foy</a></li>
<li><a href="#toc-nouveau-livre--compilation-darticles-techniques">Nouveau livre : compilation d’articles techniques</a></li>
<li><a href="#toc-nouveau-livre-pour-d%C3%A9butants-perl">Nouveau livre pour débutants Perl</a></li>
<li><a href="#toc-perl-school">Perl School</a></li>
<li><a href="#toc-pilote-officiel-mongodb-abandonn%C3%A9">Pilote officiel mongodb abandonné</a></li>
<li><a href="#toc-sortie-de-tau-station">Sortie de Tau Station</a></li>
<li><a href="#toc-pullrequestclub">PullRequestClub</a></li>
<li><a href="#toc-perlweeklychallenge">PerlWeeklyChallenge</a></li>
<li><a href="#toc-cnext">Cnext</a></li>
<li><a href="#toc-perl-5--perl-perl-6--raku">Perl 5 => Perl, Perl 6 => Raku</a></li>
<li><a href="#toc-nouvel-installeur-de-linterpr%C3%A9teur-perl-en-bash">Nouvel installeur de l’interpréteur perl (en bash)</a></li>
<li><a href="#toc-toujours-plus-de-continuous-integration-perl">Toujours plus de Continuous Integration Perl</a></li>
<li><a href="#toc-audrey-tang">Audrey Tang</a></li>
</ul>
</li>
<li>
<a href="#toc-d%C3%A9veloppement-de-perl">Développement de Perl</a><ul>
<li><a href="#toc-releasing-flow">Releasing flow</a></li>
<li><a href="#toc-pr%C3%A9c%C3%A9dentes-d%C3%A9p%C3%AAches-sur-les-sorties-des-versions-de-perl">Précédentes dépêches sur les sorties des versions de Perl</a></li>
</ul>
</li>
<li><a href="#toc-changelogs">CHANGELOGS</a></li>
<li>
<a href="#toc-sortie-de-perl-530">Sortie de Perl 5.30</a><ul>
<li>
<a href="#toc-5301">5.30.1</a><ul>
<li><a href="#toc-mise-%C3%A0-jour-des-modules">Mise à jour des modules</a></li>
<li><a href="#toc-compilation">Compilation</a></li>
<li>
<a href="#toc-corrections">Corrections</a><ul>
<li><a href="#toc-groupes-effectifs">Groupes effectifs</a></li>
<li><a href="#toc-autres">Autres</a></li>
</ul>
</li>
</ul>
</li>
<li>
<a href="#toc-5302">5.30.2</a><ul>
<li>
<a href="#toc-compilation-1">Compilation</a><ul>
<li><a href="#toc-mymalloc">MYMALLOC</a></li>
<li><a href="#toc-autres-1">Autres</a></li>
</ul>
</li>
<li>
<a href="#toc-corrections-1">Corrections</a><ul>
<li><a href="#toc-printf-n">printf %n</a></li>
<li><a href="#toc-autres-2">Autres</a></li>
</ul>
</li>
</ul>
</li>
<li>
<a href="#toc-5311">5.31.1</a><ul>
<li><a href="#toc-am%C3%A9liorations-du-c%C5%93ur-de-perl">Améliorations du cœur de Perl</a></li>
<li>
<a href="#toc-mise-%C3%A0-jour-des-modules-1">Mise à jour des modules</a><ul>
<li><a href="#toc-storable">Storable</a></li>
<li><a href="#toc-autres-3">Autres</a></li>
</ul>
</li>
<li><a href="#toc-compilation-2">Compilation</a></li>
<li>
<a href="#toc-corrections-2">Corrections</a><ul>
<li><a href="#toc-sub-zero">Sub Zero</a></li>
<li><a href="#toc-autres-4">Autres</a></li>
</ul>
</li>
</ul>
</li>
<li>
<a href="#toc-5312">5.31.2</a><ul>
<li>
<a href="#toc-am%C3%A9liorations-du-c%C5%93ur-de-perl-1">Améliorations du cœur de Perl</a><ul>
<li><a href="#toc-total-annihilation">Total annihilation</a></li>
<li><a href="#toc-autres-5">Autres</a></li>
</ul>
</li>
<li><a href="#toc-compilation-3">Compilation</a></li>
<li><a href="#toc-corrections-3">Corrections</a></li>
</ul>
</li>
<li>
<a href="#toc-5313">5.31.3</a><ul>
<li>
<a href="#toc-am%C3%A9liorations-du-c%C5%93ur-de-perl-2">Améliorations du cœur de Perl</a><ul>
<li><a href="#toc-range-et-conversions-implicites">Range et conversions implicites</a></li>
<li><a href="#toc-keep-the-stuff-left">Keep the stuff left</a></li>
<li><a href="#toc-autres-6">Autres</a></li>
</ul>
</li>
<li>
<a href="#toc-corrections-4">Corrections</a><ul>
<li><a href="#toc-propagation-des-exceptions">Propagation des exceptions</a></li>
<li><a href="#toc-exception-en-lecture-seule-lhistoire-sans-fin">Exception en lecture seule, l’histoire sans fin</a></li>
<li><a href="#toc-autres-7">Autres</a></li>
</ul>
</li>
</ul>
</li>
<li>
<a href="#toc-5314">5.31.4</a><ul>
<li><a href="#toc-am%C3%A9liorations-du-c%C5%93ur-de-perl-3">Améliorations du cœur de Perl</a></li>
<li><a href="#toc-compilation-4">Compilation</a></li>
<li><a href="#toc-corrections-5">Corrections</a></li>
</ul>
</li>
<li>
<a href="#toc-5315">5.31.5</a><ul>
<li><a href="#toc-am%C3%A9liorations-du-c%C5%93ur-de-perl-4">Améliorations du cœur de Perl</a></li>
<li><a href="#toc-compilation-5">Compilation</a></li>
</ul>
</li>
<li>
<a href="#toc-5316">5.31.6</a><ul>
<li>
<a href="#toc-am%C3%A9liorations-du-c%C5%93ur-de-perl-5">Améliorations du cœur de Perl</a><ul>
<li><a href="#toc-script-runs">Script runs</a></li>
<li><a href="#toc-autres-8">Autres</a></li>
</ul>
</li>
<li><a href="#toc-mise-%C3%A0-jour-des-modules-2">Mise à jour des modules</a></li>
<li><a href="#toc-compilation-6">Compilation</a></li>
<li><a href="#toc-corrections-6">Corrections</a></li>
</ul>
</li>
<li>
<a href="#toc-5317">5.31.7</a><ul>
<li><a href="#toc-am%C3%A9liorations-du-c%C5%93ur-de-perl-6">Améliorations du cœur de Perl</a></li>
<li>
<a href="#toc-mise-%C3%A0-jour-des-modules-3">Mise à jour des modules</a><ul>
<li><a href="#toc-vstrings">VStrings</a></li>
</ul>
</li>
<li><a href="#toc-compilation-7">Compilation</a></li>
<li><a href="#toc-corrections-7">Corrections</a></li>
</ul>
</li>
<li>
<a href="#toc-5318">5.31.8</a><ul>
<li><a href="#toc-am%C3%A9liorations-du-c%C5%93ur-de-perl-7">Améliorations du cœur de Perl</a></li>
<li><a href="#toc-documentation">Documentation</a></li>
<li><a href="#toc-compilation-8">Compilation</a></li>
<li><a href="#toc-corrections-8">Corrections</a></li>
</ul>
</li>
<li>
<a href="#toc-5319">5.31.9</a><ul>
<li><a href="#toc-am%C3%A9liorations-du-c%C5%93ur-de-perl-8">Améliorations du cœur de Perl</a></li>
<li><a href="#toc-compilation-9">Compilation</a></li>
<li>
<a href="#toc-corrections-9">Corrections</a><ul>
<li><a href="#toc-require-naime-pas-local-inc">require n’aime pas local %INC</a></li>
<li><a href="#toc-autres-9">Autres</a></li>
</ul>
</li>
</ul>
</li>
<li>
<a href="#toc-53110">5.31.10</a><ul>
<li>
<a href="#toc-am%C3%A9liorations-du-c%C5%93ur-de-perl-9">Améliorations du cœur de Perl</a><ul>
<li><a href="#toc-op%C3%A9rateurs-cha%C3%AEnes">Opérateurs chaînes</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#toc-53111">5.31.11</a></li>
<li><a href="#toc-5320-rc0">5.32.0-RC0</a></li>
<li><a href="#toc-5320-rc1">5.32.0-RC1</a></li>
<li><a href="#toc-5320">5.32.0</a></li>
<li><a href="#toc-conclusion">Conclusion</a></li>
</ul>
</li>
</ul>
<h2 id="toc-rétrospective-de-2019-et-même-un-peu-plus-morceaux-sélectionnés">Rétrospective de 2019 et même un peu plus, morceaux sélectionnés</h2>
<h3 id="toc-les-perl-porters-migrent-vers-github">Les Perl porters migrent vers GitHub</h3>
<p>Les développeurs de Perl 5, sous l’impulsion de leur <em>pumpking</em> (mainteneur en chef) <a href="https://github.com/xsawyerx">Sawyer X</a>, ont décidé de migrer le dépôt ainsi que le gestionnaire de tickets de Perl 5 vers <a href="https://github.com/Perl/perl5">GitHub</a>.</p>
<p>Cela a consisté en deux choses :</p>
<ul>
<li>migrer le code depuis <em><a href="https://perl5.git.perl.org/perl.git">perl5.git.perl.org</a></em> vers <a href="https://github.com/Perl/perl5">Perl 5 sur GitHub</a> ; 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 ;</li>
<li>migrer les tickets depuis <a href="https://rt.perl.org/Public/Search/Results.html?Query=Queue%20=%20%27perl5%27">Perl Request Tracker</a> vers <a href="https://github.com/Perl/perl5/issues">GitHub issue tracker</a>, ç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).</li>
</ul>
<h3 id="toc-version-majeure-de-request-tracker">Version majeure de Request Tracker</h3>
<p>L’entreprise <a href="https://bestpractical.com">Best Practical</a> fondée par <a href="https://fr.wikipedia.org/wiki/Jesse_Vincent">Jesse Vincent</a> (un dev Perl très reconnu et ancien Perl Pumpking) derrière le logiciel professionnel de ticketing <a href="https://bestpractical.com/request-tracker">Request tracker</a> a annoncé <a href="https://bestpractical.com/blog/2019/12/20-years-of-rt-starting-20-more-with-rt-5-mtz8c">l’arrivée imminente de la version <strong>5</strong></a> puis la disponibilité de la <a href="https://bestpractical.com/blog/2020/5/rt-50-beta-1-now-available">5.0.0 beta 1</a>.</p>
<p>Cette version contient notamment la migration vers <a href="https://getbootstrap.com">Bootstrap</a> en tant que cadriciel CSS et le passage à <a href="https://www.chartjs.org/">chart.js</a> pour les graphiques.</p>
<p><a href="https://bestpractical.com/request-tracker">Request Tracker</a> 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 (<a href="https://github.com/bestpractical/rt">code source</a>), avec des possibilités infinies de personnalisations et d’interfaçage.</p>
<p>Vous pouvez trouver le code source sur le <a href="https://github.com/bestpractical/rt">dépôt GitHub</a>, ainsi que de <a href="https://www.request-tracker.fr/">la doc et du support français</a>, par <a href="https://www.easter-eggs.com/Presentation-d-Easter-eggs">Easter‑Eggs</a>, qui est une <a href="https://cnll.fr/news/les-ssll-deviennent-enl/">entreprise française du Numérique libre</a>.</p>
<p>Longue vie a RT5 !</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f692e696d6775722e636f6d2f696648774a4e482e706e67/ifHwJNH.png" alt="Logo RT" title="Source : https://i.imgur.com/ifHwJNH.png"></p>
<h3 id="toc-programmation-orientée-objet-native-bientôt-intégrée-dans-le-cœur-deperl">Programmation orientée objet native bientôt intégrée dans le cœur de Perl</h3>
<p>L’année 2019 a été également celle d’un travail sur le module <strong>Cor</strong>, 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 <strong><em>packages</em></strong> et les <strong><em>tie</em></strong>/<strong><em>bless</em></strong>, mais ce n’est pas hyper élégant.</p>
<p>De nombreux très bons modules ont ainsi été créés pour combler ce défaut (<strong>Moo</strong>, <strong>Moose</strong>, <strong>Mouse</strong>, etc.). </p>
<p><strong>Cor</strong> est une tentative dirigée par <a href="https://gist.github.com/Ovid">Curtis Ovid Poe</a> d’inclure ces fonctionnalités dans le cœur de Perl. La spécification est collaborative sur son <a href="https://gist.github.com/Ovid/68b33259cb81c01f9a51612c7a294ede">Gist GitHub</a>.</p>
<p>Plus d’infos :</p>
<ul>
<li>
<a href="https://github.com/Ovid/Cor/wiki">wiki</a> ;</li>
<li>
<a href="https://github.com/Ovid/Cor/wiki/Cookbook">comparaison de syntaxe avec Moose</a> ;</li>
<li>
<a href="https://github.com/stevan/Cor">première implémentation (proto)</a>.</li>
</ul>
<h3 id="toc-nouveau-livre-de-briand-d-foy">Nouveau livre de briand d foy</h3>
<p>Pour celles et ceux qui ne connaissent pas, le cadriciel Web <a href="https://www.mojolicious.org/">Mojolicious</a> est une véritable pièce de maître qui n’a rien à envier aux <em>Django, RoR, Flask ou ChoisissezCeQueVousVoulez</em>.</p>
<p>C’est d’ailleurs bien plus qu’un framework web… Plutôt un framework de développement. Par exemple, la prochaine version majeure de <a href="https://www.bugzilla.org/">Bugzilla</a> sera notamment <a href="https://dylan.hardison.net/2020/02/09/bugzilla-project-updates-2020/">réécrite avec</a> .</p>
<p><strong>Mojolicious</strong> est un travail communautaire initié par <a href="https://twitter.com/kraih?lang=fr">Sebastian Riedel</a> (OpenSuse) qui était également le créateur du cadriciel <a href="http://www.catalystframework.org/">Catalyst</a> (cadriciel Web MVC).</p>
<p>Un membre très reconnu de la communauté Perl <a href="https://en.wikipedia.org/wiki/Brian_d_foy">brian d foy</a> (<em>sic</em>) a écrit un livre sur les <a href="https://leanpub.com/mojo_web_clients">clients Web écrits avec Mojolicious</a>.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f692e696d6775722e636f6d2f384a37445774722e706e67/8J7DWtr.png" alt="mojolicious" title="Source : https://i.imgur.com/8J7DWtr.png"></p>
<h3 id="toc-nouveau-livre--compilation-darticles-techniques">Nouveau livre : compilation d’articles techniques</h3>
<p>Sortie de <a href="https://perlschool.com/the-best-of-perl-hacks">The best of Perl Hacks</a> par <strong>Dave Cross</strong>.</p>
<p>C’est une sorte de recueil de billets de blogs sélectionnés (comme furent en leurs temps les « <em>Best of Perl Journal</em> » qui étaient en plusieurs volumes !).</p>
<p><strong>Dave Cross</strong> est un expert du largage Perl et il a tenu pendant des années un blog technique. </p>
<p>Il a décidé de sélectionner les meilleurs articles des dix dernières années pour les compiler dans un livre.</p>
<h3 id="toc-nouveau-livre-pour-débutants-perl">Nouveau livre pour débutants Perl</h3>
<p>Sortie du nouveau livre <em><a href="https://perlschool.com/books/perl-taster">Perl Taster: Your First Two Hours With Perl</a></em>, toujours par Dave Cross.</p>
<p>Ce livre cible les débutants en Perl.</p>
<h3 id="toc-perl-school">Perl School</h3>
<p>Les trois livres vus précédemment font partie de <a href="https://perlschool.com">PerlSchool</a> qui est une sorte de « maison d’édition indépendante de livres dématérialisés ».</p>
<p>D’autres livres sont sortis (moins récemment) sous le giron de PerlSchool :</p>
<ul>
<li>
<em><a href="https://perlschool.com/books/selenium-perl">Selenium and Perl</a></em>, par <strong>John Davies</strong> ;</li>
<li>
<em><a href="https://perlschool.com/books/cucumber-and-perl">Cucumber and Perl</a></em>, par <strong>John Davies</strong> ;</li>
<li>
<em><a href="https://perlschool.com/books/learning-perl-exercises">Learning Perl excercises</a></em>, par <strong>brian d foy</strong>.</li>
</ul>
<h3 id="toc-pilote-officiel-mongodb-abandonné">Pilote officiel mongodb abandonné</h3>
<p>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 <a href="//linuxfr.org/users/spack/journaux/sspl-all-your-service-are-belong-to-us">un journal sur LinuxFr.org</a>), MongoDB s’est mis une partie des développeurs Perl à dos en <a href="https://metacpan.org/pod/MongoDB#END-OF-LIFE-NOTICE">abandonnant son pilote officiel pour Perl</a>. </p>
<p>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à. </p>
<p>L’ancien dev de l’implémentation pure Perl du pilote MongoDB <a href="https://metacpan.org/pod/Mango">Mango</a> (<a href="https://metacpan.org/author/SRI">Sebastian Riedel</a>… encore lui !) a répondu à cette nouvelle par un cinglant « bon débarras ».</p>
<p>Par le passé, il avait déjà rapporté que le développement de mango <strong>était un calvaire</strong> car <a href="https://www.reddit.com/r/perl/comments/cvuyko/the_mongodb_perl_driver_is_being_deprecated">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</a>.</p>
<p>Si vous utilisiez ou envisagiez d’utiliser MongoDB parce que… c’est un peu « <em>hype</em> », un conseil donc, FUYEZ !</p>
<h3 id="toc-sortie-de-tau-station">Sortie de Tau Station</h3>
<p>Tau Station est selon son équipe de développement un <strong>jeu en mode texte massivement multijoueur dans un navigateur</strong>.</p>
<p>Il est décrit en français dans ce <a href="https://blog.kharec.info/post/mmorpg-tau-station/">billet de blog</a> de <a href="https://blog.kharec.info">Sandro Cazzaniga</a>.</p>
<p>Il est gratuit… Allez tester cette pépite : <a href="https://taustation.space/">TauStation</a></p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f692e696d6775722e636f6d2f4d48437764684a2e706e67/MHCwdhJ.png" alt="Tau Station" title="Source : https://i.imgur.com/MHCwdhJ.png"></p>
<h3 id="toc-pullrequestclub">PullRequestClub</h3>
<p>Suite au défunt <strong>CPAN Pull Request Challenge</strong>, une autre équipe a mis en place le <a href="https://pullrequest.club/hello">PullRequestClub</a>. </p>
<p>C’est un site Web (<a href="https://github.com/kyzn/PRC">code source</a>) qui consiste à encourager les développeurs à faire des <em>pull requests</em> en mettant en relation mainteneurs gentils avec développeurs motivés. Je trouve que ça ressemble un peu dans l’esprit à <a href="https://hacktoberfest.digitalocean.com">Hacktoberfest</a>.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f692e696d6775722e636f6d2f46636c6d476b732e706e67/FclmGks.png" alt="PullRequestClub" title="Source : https://i.imgur.com/FclmGks.png"></p>
<h3 id="toc-perlweeklychallenge">PerlWeeklyChallenge</h3>
<p>Les développeurs Perl ont toujours aimé s’amuser en programmant avec des petits défis (Perl golf, japhs, poésie Perl, code obfusqué…). </p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f696d67732e786b63642e636f6d2f636f6d6963732f72656765785f676f6c665f32782e706e67/regex_golf_2x.png" alt="Image regex golf" title="Source : https://imgs.xkcd.com/comics/regex_golf_2x.png"> <em>xkcd (<a href="https://xkcd.com/1313/">lien</a>) — Licence CC BY‑NC</em></p>
<p>Une compétition amicale a été mise en place récemment et connaît un grand succès, il s’agit du <a href="https://perlweeklychallenge.org">PerlWeeklyChallenge</a> !</p>
<p>Cette initiative qui propose des challenges d’algorithmique en Perl ou Raku (ou parfois d’autres langages) a clairement marqué l’année 2019. </p>
<p>Cette initiative, orchestrée de main de maître par <a href="https://github.com/manwar">Mohammad Anwar</a> (de <em><a href="https://perlweekly.com/">Perl Weekly</a></em>) consiste à remplir des petits « défis » hebdomadaires.</p>
<p>Un seul mot pour terminer sur ce sujet… <strong>Un grand merci Mohammad !</strong></p>
<h3 id="toc-cnext">Cnext</h3>
<p><a href="https://next-cpan.github.io/cnext/">cnext</a> est un nouveau <strong>client CPAN</strong>. </p>
<p>L’approche de ce client est différente de <a href="https://metacpan.org/pod/App::cpanminus">cpanminus</a> ou <a href="https://github.com/skaji/cpm">cpm</a> car il ne cible pas l’architecture des serveurs <strong>CPAN</strong> mais GitHub. L’index est dans un dépôt github (<a href="https://github.com/pause-play/pause-index">pause-index</a>). </p>
<p>Plus d’infos sur l’index dans la <a href="https://github.com/next-cpan/next-indexes">doc de next-indexes</a>.</p>
<p>À noter que cpanminus utilise aussi un index alternatif <a href="https://cpanmetadb.plackperl.org">metaDB</a> et qu’il en existe plusieurs autres. </p>
<p><strong>cnext</strong> n’est aujourd’hui pas encore fonctionnel. </p>
<h3 id="toc-perl-5--perl-perl-6--raku">Perl 5 => Perl, Perl 6 => Raku</h3>
<p>2019 a également connu le renommage de Perl 6 en Raku. </p>
<p>Je n’en dis pas plus, on y reviendra peut-être dans une dépêche dédiée (?) (<strong><em>need help</em></strong>). </p>
<h3 id="toc-nouvel-installeur-de-linterpréteur-perl-en-bash">Nouvel installeur de l’interpréteur perl (en bash)</h3>
<p>Parmi les <code>perlbrew</code>, <code>plenv</code> etc. voici un petit nouveau : <a href="https://github.com/skaji/perl-install">perl-install</a>. </p>
<p>L’idée étant d’implémenter l’installeur en <code>bash</code> pour pouvoir installer sur des machines ne disposant pas de Perl. </p>
<p>Perl est partout me direz-vous… Oui mais après l’annonce d’Apple de ne pas fournir les interpréteurs pour <code>ruby</code>, <code>python</code> et <code>perl</code> dans leur OS de base, c’est potentiellement un nouveau besoin d’avoir un installeur dans un langage encore supporté.</p>
<h3 id="toc-toujours-plus-de-continuous-integration-perl">Toujours plus de Continuous Integration Perl</h3>
<p>En plus des vénérables travis, circle ci, appveyor, gitlab ci, l’année 2019 a vu fleurir quelques github actions pour perl : <a href="https://github.com/marketplace/actions/install-with-cpm">installer avec cpm</a>, <a href="https://github.com/marketplace/actions/install-with-cpanm">installer avec cpanminus</a>, <a href="https://github.com/marketplace/actions/setup-perl-environment">environement Perl</a> et <a href="https://github.com/marketplace/actions/github-action-for-perl-critic">Perl Critic</a></p>
<p>Les images officielles pour perl : <a href="https://hub.docker.com/_/perl">dockerhub Perl</a> </p>
<p>J’en profite pour placer quelques liens vers des helpers (GitHub actions ou d’autres infrastructures) : </p>
<ul>
<li>
<a href="https://gitlab.com/rsrchboy/perl-ci">helpers Gitlab</a> </li>
<li><a href="https://github.com/travis-perl/helpers">helpers Travis</a></li>
<li>
<a href="https://github.com/houseabsolute/ci-perl-helpers">helpers GitHub houseabsolute</a> ou encore <a href="https://github.com/plicease/cip">helpers GitHub cip</a>
</li>
</ul>
<h3 id="toc-audrey-tang">Audrey Tang</h3>
<p><a href="https://en.wikipedia.org/wiki/Audrey_Tang">Audrey Tang</a> est une membre respectée et programmeuse géniale qui a eu beaucoup d’influence sur <strong>Perl</strong> et <strong>Raku</strong>. Elle occupe depuis quelques années un poste de ministre à Taïwan. </p>
<p>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.</p>
<p>Parmi ses travaux notables, on trouve <a href="https://fr.wikipedia.org/wiki/Pugs">Pugs</a> et <a href="https://fr.wikipedia.org/wiki/EtherCalc">EtherCalc</a> (et pas mal d’autres comme <a href="https://metacpan.org/pod/Module::Install">Module::Install</a>, des contributions à <a href="https://bestpractical.com/request-tracker">Request Tracker</a> vu plus haut, <a href="https://fr.wikipedia.org/wiki/SVK_(logiciel)">SVK</a>, <a href="https://metacpan.org/pod/PAR">PAR</a>, <a href="https://en.wikipedia.org/wiki/Slash_(software)">Slash</a> etc.)</p>
<h2 id="toc-développement-de-perl">Développement de Perl</h2>
<h3 id="toc-releasing-flow">Releasing flow</h3>
<p>Pour le releasing flow en général, se référer à la <a href="//linuxfr.org/news/sortie-de-perl-5-30-0#toc-autres-versions-de-perl">dépêche sur Perl 5.30.0</a> qui détaille plus les notions comme <strong>blead</strong>, <strong>pumpking</strong> ou encore le <strong>schéma de versioning</strong>.</p>
<p>Perl 5.30.0 a été <a href="https://www.nntp.perl.org/group/perl.perl5.porters/2019/05/msg254844.html">publié en mai 2019</a> et le <em>pumpking</em> était <strong>Sawyer X</strong>. </p>
<p>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ù <a href="https://www.nntp.perl.org/group/perl.perl5.porters/2019/05/msg254848.html">cet appel à volontaires en début de cycle de développement</a>.</p>
<p>Ensuite durant une année, des versions de développement (version perl <strong>5.impair.sousversion</strong>) sont publiées chaque mois.</p>
<p>L’intégration de code dans la branche de développement passe des tests de compilation (<strong>github action</strong> dans le dépôt, matrice d’options <code>configure</code>, <code>make</code>, <code>make test</code>) et des « smoke tests » (des tests dans des VMs). Enfin, après chaque sortie de version de developpement, un rapport de test de la <strong>« rivière CPAN »</strong> (ensemble de <strong>3000 modules CPAN</strong> dont beaucoup d’autres modules dépendent) est exécuté et sert également pour vérifier les non-régressions.</p>
<p>Il n’y a pas de date de sortie décidée pour la version stable, donc elle sort quand elle est prête.</p>
<p>Lors du développement de perl 5.30.0, les versions de dev s’étaient arrêtées à <code>5.29.10</code>, cette fois les versions de dev s’étalent un tout petit peu plus (<code>5.31.11</code>). En mars <strong>Sawyer X</strong> a décidé de <a href="https://www.nntp.perl.org/group/perl.perl5.porters/2020/04/msg257359.html">décaler la 5.31.11 d’une semaine</a> et de <a href="https://www.nntp.perl.org/group/perl.perl5.porters/2020/04/msg257375.html">faire une nouvelle version de dev et de décaler d’un mois la sortie de la version stable</a>. </p>
<p>Finalement il n’y aura pas eu de <code>5.31.12</code> mais une <code>5.32.0-RC0</code> le 30 mai.</p>
<p>Voici une frise représentative des versions :</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f692e696d6775722e636f6d2f544f3237794c4e2e706e67/TO27yLN.png" alt="Versions" title="Source : https://i.imgur.com/TO27yLN.png"></p>
<hr>
<h3 id="toc-précédentes-dépêches-sur-les-sorties-des-versions-de-perl">Précédentes dépêches sur les sorties des versions de Perl</h3>
<ul>
<li>
<a href="//linuxfr.org/news/sortie-de-perl-5100">Sortie de Perl 5.10</a> en 2007.</li>
<li>
<a href="//linuxfr.org/news/perl-512-une-constante-jeunesse">Sortie de Perl 5.12</a> en 2010.</li>
<li>
<a href="//linuxfr.org/users/jbbourgoin/journaux/sortie-de-perl-5140">Sortie de Perl 5.14</a> en 2011.</li>
<li>
<a href="//linuxfr.org/news/perl-5-16-0">Sortie de Perl 5.16</a> en 2012.</li>
<li>
<a href="//linuxfr.org/news/sortie-de-perl-5-22-0">Sortie de Perl 5.18, 5.20 et 5.22</a> (5.18 en 2013, 5.20 en 2014, 5.22 en 2015).</li>
<li>
<a href="//linuxfr.org/news/sortie-de-perl-5-30-0">Sortie de Perl 5.24, 5.26, 5.28 et 5.30</a> (5.24 en 2016, 5.26 en 2017, 5.28 en 2018, 5.30 en 2019).</li>
</ul>
<h2 id="toc-changelogs">CHANGELOGS</h2>
<p><strong>Perl 5.32.0</strong> est sorti le 20 juin (<a href="https://www.nntp.perl.org/group/perl.perl5.porters/2020/06/msg257547.html">annonce</a>).</p>
<p>Place maintenant aux différents <strong>CHANGELOG</strong> ou <strong>perldelta</strong> qui n’ont pas été traités sur <strong>LinuxFR</strong>.</p>
<h2 id="toc-sortie-de-perl-530">Sortie de Perl 5.30</h2>
<p>La version <strong>5.30.0</strong> a déjà été traitée dans la <a href="//linuxfr.org/news/sortie-de-perl-5-30-0">dépêche sortie de perl 5.30</a>, on passe donc directement à la version suivante qui est la <em>version patch</em> <strong>5.30.1</strong>.</p>
<h3 id="toc-5301">5.30.1</h3>
<h4 id="toc-mise-à-jour-des-modules">Mise à jour des modules</h4>
<ul>
<li>Seulement <strong>Module::Corelist</strong> qui contient la liste des modules (autant dire aucun changement)</li>
</ul>
<h4 id="toc-compilation">Compilation</h4>
<ul>
<li><p>Un correctif concernant <strong>OpenBSD</strong>, <strong>FreeBSD</strong> et <strong>Solaris</strong> qui concerne la macro <code>ECHO</code> lorsqu’on souhaite utiliser <code>dtrace</code>. Le configure de Perl ne définit pas correctement cette variable, mais elle est généralement définie par le <code>make</code> du système. Pour avoir le problème, il faut être par exemple sur une <strong>Solaris</strong> et configurer avec <code>-Dusedtrace</code>. Le correctif se trouve dans le <code>Makefile.SH</code>.</p></li>
<li><p>Les tests de <strong><em>locale</em></strong> 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.</p></li>
</ul>
<h4 id="toc-corrections">Corrections</h4>
<h5 id="toc-groupes-effectifs">Groupes effectifs</h5>
<p>Un correctif sur le setter de la variable <code>$)</code> (si on a les privilèges de le faire). La variable <strong>$)</strong> permet d’accéder aux <strong>effective groups</strong>. Par exemple :<br>
<code>perl -e "print $)"</code></p>
<p>Nous donnera :</p>
<p><code>1000 4 24 27 30 46 116 126 999 1000 1001</code></p>
<p>Et pour info voici la sortie de <code>id</code> : </p>
<pre><code class="bash"><span class="nv">uid</span><span class="o">=</span><span class="m">1000</span><span class="o">(</span>johndoe<span class="o">)</span> <span class="nv">gid</span><span class="o">=</span><span class="m">1000</span><span class="o">(</span>johndoe<span class="o">)</span> <span class="nv">groups</span><span class="o">=</span><span class="m">1000</span><span class="o">(</span>johndoe<span class="o">)</span>,4<span class="o">(</span>adm<span class="o">)</span>,24<span class="o">(</span>cdrom<span class="o">)</span>,27<span class="o">(</span>sudo<span class="o">)</span>,30<span class="o">(</span>dip<span class="o">)</span>,46<span class="o">(</span>plugdev<span class="o">)</span>,116<span class="o">(</span>lpadmin<span class="o">)</span>,126<span class="o">(</span>sambashare<span class="o">)</span>,999<span class="o">(</span>docker<span class="o">)</span>,1001<span class="o">(</span>usb<span class="o">)</span></code></pre>
<p>Parmi les autres variables en Perl pour accéder à ce type d’infos (et qu’on peut utiliser pour potentiellement baisser les privilèges) :</p>
<ul>
<li>
<code>$<</code>, identifiant utilisateur réel ;</li>
<li>
<code>$></code>, identifiant utilisateur effectif ;</li>
<li>
<code>$(</code>, identifiant de groupe réel ;</li>
<li>
<code>$)</code>, identifiant de groupe effectif (on vient d’en parler).</li>
</ul>
<h5 id="toc-autres">Autres</h5>
<ul>
<li><p>Correction d’un bogue avec <code>readline</code> qui évalue en contexte de liste alors qu’il n’attend qu’une seule valeur de retour. La fonction <code>readline</code> en Perl permet de jouer avec les <em>handles</em> de fichiers (<code>my $line = <STDIN></code> est équivalent à <code>my $line = readline(STDIN);</code>)</p></li>
<li><p>Un bogue mystérieux avec la gestion des signaux et <strong>sv_gets</strong></p></li>
<li><p>Une fuite de mémoire lorsqu’on essaye de faire une correspondance d’expression rationnelle entre une chaîne non explicitement marquée <strong>UTF‑8</strong> et un caractère Unicode. Le cas d’exemple est <code>"a" =~ /\N{U+2129}/ while 1;</code> et le code voit qu’il y a un problème de correspondance, mais il manque un retour de fonction.</p></li>
<li><p>Correction d’un débordement de tampon (<em>buffer overflow</em>) lorsqu’on se sert de précision négative <code>sprintf("%.*a", -10000, $x)</code> (pourquoi faire ça ?)</p></li>
<li><p>correction d’un bogue sur l’appel de <code>scalar</code> et le multidéréférencement qui posait un problème d’assertion dans l’étape de compilation.</p></li>
</ul>
<h3 id="toc-5302">5.30.2</h3>
<h4 id="toc-compilation-1">Compilation</h4>
<h5 id="toc-mymalloc">MYMALLOC</h5>
<p>Le build de <code>MYMALLOC</code> sur Windows a été corrigé. <em>MYMALLOC</em> est l’implémentation Perl de <code>malloc</code>. </p>
<p>On peut l’utiliser si on donne <code>-Dusemymalloc</code> à <code>Configure</code> :</p>
<pre><code>/* 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.
*/
</code></pre>
<h5 id="toc-autres-1">Autres</h5>
<ul>
<li>prise en charge de <strong>GCC 10</strong> !</li>
</ul>
<h4 id="toc-corrections-1">Corrections</h4>
<h5 id="toc-printf-n">printf %n</h5>
<p>Correction d’un bogue avec le <strong>très spécial</strong> format <strong>%n</strong> de <code>printf</code> et <code>sprintf</code>.</p>
<p>D’habitude on utilise <code>printf</code> 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.</p>
<p>D’après la <a href="https://perldoc.perl.org/functions/sprintf.html">doc de sprintf</a> :</p>
<p><code>%n special: *stores* the number of characters output so far into the next argument in the parameter list</code></p>
<p>Voici un exemple :</p>
<pre><code class="perl"><span class="n">perl</span> <span class="o">-</span><span class="n">e</span> <span class="s">'printf("123 %n 456 -> ", $count); print $count;'</span></code></pre>
<p>va produire </p>
<pre><code>123 456 -> 4
</code></pre>
<p>Le bogue était lié à l’utilisation conjointe de <code>%n</code> et d’<strong>UTF‑8</strong> (produisant une mauvaise valeur) avec un Perl ayant l’option de débogage activée (dans ce cas Perl se mettait à paniquer).</p>
<p>Et pendant qu’on y est : </p>
<p><code>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.</code></p>
<h5 id="toc-autres-2">Autres</h5>
<ul>
<li><p>Correctif d’une fuite mémoire après une refactorisation des classes de caractères dans les expressions rationnelles (<code>m/[...]/</code>). Le problème a été introduit en <strong>5.26</strong>. Ce correctif est marqué comme candidat à être répercuté sur des versions correctives de <strong>5.26</strong> et <strong>5.28</strong></p></li>
<li><p>correction d’un bogue dans les <a href="https://perldoc.pl/perluniprops">propriétés Unicode</a> <code>qr/\p{nv:qnan}/</code>. <code>\p{...}</code> introduit une propriété Unicode. Ici de la forme <code>\p{nom:valeur}</code>. <code>nv</code> est un <a href="https://perldoc.pl/perlguts#Formatted-Printing-of-IVs,-UVs,-and-NVs">double</a> et donc ça veut dire « <em>Numeric Value is Not a Number</em> ». Il s’agissait d’un <strong><em>heap buffer overflow</em></strong></p></li>
<li><p>Correction d’une <strong>assertion failure</strong> dans les expressions rationnelles avec <em>script run</em> (<code>(sr:...)</code> incomplets.</p></li>
<li><p>Une limitation de l’exécution de code récursif dans les expressions rationnelles (<code>(?{ code })</code> et <code>(??{ code })</code>) est mieux gérée. En effet, le code profondément récursif émettait un <em>warning</em>. Le correctif consiste à n’appliquer la limitation plus qu’à <code>(??{ code })</code> (évalue le retour du code embarqué).</p></li>
</ul>
<h3 id="toc-5311">5.31.1</h3>
<h4 id="toc-améliorations-du-cœur-de-perl">Améliorations du cœur de Perl</h4>
<ul>
<li><p>Interdiction d’utiliser <code>vec</code> et les opérations <code>bitwise</code> sur les caractères Unicode après <code>0xff</code>. Ç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.</p></li>
<li><p><code>Sys::Hostname::hostname()</code> n’accepte plus d’argument (déprécié depuis <strong>5.28</strong>)</p></li>
</ul>
<h4 id="toc-mise-à-jour-des-modules-1">Mise à jour des modules</h4>
<h5 id="toc-storable">Storable</h5>
<p>Mise à jour de <a href="https://perldoc.pl/Storable">Storable</a> pour régler un problème de clone. <strong>Storable</strong> 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. </p>
<p>Le bogue est tiré par les cheveux, il faut combiner <em>affaiblissement de référence</em> + <em>expression rationnelle compilée dans une variable</em> + <em>autovivication</em> + <em>clone en profondeur</em>.</p>
<p>Comme ceci : </p>
<pre><code class="perl"><span class="k">my</span> <span class="nv">$foo</span> <span class="o">=</span> <span class="p">[</span><span class="sx">qr//</span><span class="p">,</span><span class="o">[]</span><span class="p">];</span>
<span class="n">weaken</span><span class="p">(</span><span class="nv">$foo</span><span class="o">-></span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$foo</span><span class="o">-></span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
<span class="n">dclone</span> <span class="nv">$foo</span><span class="p">;</span></code></pre>
<h5 id="toc-autres-3">Autres</h5>
<ul>
<li><p>Correction sur le module <strong>IO</strong>. La fonction <strong>sendto</strong> n’utilisait pas la « to » et donc ignorait l’adresse paire</p></li>
<li><p><strong>Pod::Parser</strong> est supprimé du core mais reste évidemment accessible grâce au <strong>CPAN</strong></p></li>
</ul>
<h4 id="toc-compilation-2">Compilation</h4>
<ul>
<li><p>Le script <strong>autodoc.pl</strong> a été fortement remanié</p></li>
<li><p>Fin du support du build pour <strong>Windows CE</strong></p></li>
</ul>
<h4 id="toc-corrections-2">Corrections</h4>
<h5 id="toc-sub-zero">Sub Zero</h5>
<p>Une parenthèse fermante fallacieuse (sans ouvrante correspondante) pouvait poser problème dans un <strong>sub parse</strong>. </p>
<p>Un <strong><em>sub parse</em></strong> est une analyse dans une expression rationnelle comme <code>my $str =~ s/(41)/$1+1/e</code> qui va remplacer 41 par 42 avec une analyse de <code>$1+1</code> pour faire <code>41+1=42</code>. Ce comportement est activé par le modificateur <code>/e</code> (<em>evaluate</em>).</p>
<p>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.</p>
<p>La solution est d’ajouter un symbole <em>virtuel</em> qui ne peut pas être écrit dans le source.</p>
<h5 id="toc-autres-4">Autres</h5>
<ul>
<li><p>Un correctif dans <strong>PerlIO</strong> concernant les descripteurs de fichier et la fonction <code>close</code></p></li>
<li><p>Comme documenté <code>%{^CAPTURE_ALL}</code> est a présent un alias de <code>%-</code> et non <code>%+</code> (erreur)</p></li>
<li><p>Un autre bogue sur <code>%{^CAPTURE}</code> et <code>@{^CAPTURE}</code>. Comme vous le savez peut‑être (pas) en Perl <code>$var</code> est différent de <code>@var</code> qui est différent de <code>%var</code>. Le <em>hash</em> <code>%{^CAPTURE}</code> était vide si l’on avait appelé <code>@{^CAPTURE}</code> avant (et inversement).</p></li>
<li><p>Correction d’un <em>integer overflow</em> 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.</p></li>
<li><p>Mauvais analyse lexicale des <code>0x</code> ou <code>0b</code> incomplets (sans rien après). <code>print -e 'print 0x - 1'</code> produit <code>1</code> … </p></li>
<li><p>Le <strong>sub parsing</strong> a été également amélioré en règle générale pour accepter plus de choses qui sont acceptées par le <em>parsing standard</em></p></li>
<li><p>Correction d’un bogue dans l’affectation des références de code (<code>\&f1 = \&f2</code>) dans le <em>package</em> par défaut (<code>main::</code>).</p></li>
</ul>
<h3 id="toc-5312">5.31.2</h3>
<h4 id="toc-améliorations-du-cœur-de-perl-1">Améliorations du cœur de Perl</h4>
<h5 id="toc-total-annihilation">Total annihilation</h5>
<p>Il existe une variable d’environnement <a href="https://perldoc.pl/perlhacktips#PERL_DESTRUCT_LEVEL">PERL_DESTRUCT_LEVEL</a> 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 <a href="https://fr.wikipedia.org/wiki/Gestion_de_m%C3%A9moire_par_r%C3%A9gions">gestion mémoire par région</a> (et d’éviter les fuites de mémoires). </p>
<p>Lorsque cette variable n’est pas définie, Perl laisse le soin à <code>exit</code> de faire ce travail. </p>
<p>L’amélioration consiste à prendre en compte cette variable même lorsque l’interpréteur n’a pas été compilé en mode débogage.</p>
<h5 id="toc-autres-5">Autres</h5>
<ul>
<li><p>Nouvelle erreur <strong>No digits found for %s literal</strong> lorsqu’on écrit en base hexa (<code>0x…</code>) ou binaire (<code>0b…</code>) quelque chose qui n’est pas de l’hexa ou du binaire</p></li>
<li><p>Meilleure gestion de la propagation des signaux critiques dans les <code>eval</code></p></li>
<li><p>Correction d’un bogue dans les blocs <code>CHECK</code>, <code>BEGIN</code>, etc., il s’agit d’un problème de gestion d’<code>exit</code>.</p></li>
<li><p>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 ?).</p></li>
</ul>
<h4 id="toc-compilation-3">Compilation</h4>
<ul>
<li><p>Support de <a href="https://www.gnu.org/software/bison/">Bison</a> (le générateur d’analyseur syntaxique) versions <strong>3.1</strong> jusqu’à <strong>3.4</strong></p></li>
<li><p>Correction mineure du Configure avec <code>clang</code>. </p></li>
<li><p><code>-Duse64bitint</code> devient la valeur par défaut si on compile sur <strong>VMS</strong></p></li>
<li><p>Problème de compilation avec <strong>VC++ 6.0</strong> qui ne sera pas corrigé, car le support va être arrêté.</p></li>
</ul>
<h4 id="toc-corrections-3">Corrections</h4>
<ul>
<li><p>Des corrections en lien avec l’amélioration de la gestion des signaux dans les <code>eval</code>, la gestion des <code>0x…</code> et <code>0b…</code> et les <code>exit</code> dans les blocs d’<strong>INIT</strong></p></li>
<li><p>Correction concernant les ouvertures de fichiers temporaires <code>open my $fh, ">>+", undef</code> ; la correction de ce bogue est ce qui a cassé la compilation <strong>VC++6</strong></p></li>
<li><p>Correction d’une erreur de segmentation mémoire (<strong>SEGV</strong>) avec le déréférencement multiple (récursive) dans les expressions rationnelles (avec <code>*</code>, par exemple) </p></li>
</ul>
<h3 id="toc-5313">5.31.3</h3>
<h4 id="toc-améliorations-du-cœur-de-perl-2">Améliorations du cœur de Perl</h4>
<h5 id="toc-range-et-conversions-implicites">Range et conversions implicites</h5>
<p>L’opérateur <code>range</code> gère mieux les conversions implicites. </p>
<p>L’opérateur range est <code>..</code> et il permet de faire des choses simples comme </p>
<pre><code class="perl"><span class="k">print</span> <span class="mi">1</span><span class="o">..</span><span class="mi">10</span></code></pre>
<p>qui va générer une liste de 1 à 10 :</p>
<pre><code>12345678910
</code></pre>
<p>Ou il peut faire des choses comme </p>
<pre><code class="perl"><span class="s">"ab"</span><span class="o">..</span><span class="s">"ba"</span></code></pre>
<p>qui va donner </p>
<pre><code>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
</code></pre>
<p>Dans le cas de <code>"0"".."-1"</code>, on générait avant une liste de 0 jusqu’à 99 et maintenant ça sera une liste vide.</p>
<h5 id="toc-keep-the-stuff-left">Keep the stuff left</h5>
<p><code>\K</code> est à présent interdit dans les assertions <em>lookbehind</em> et <em>lookahead</em> car :</p>
<ol>
<li>le comportement est cassé :</li>
<li>personne ne peut dire quel est le comportement attendu.</li>
</ol>
<p><code>\K</code> est <strong>"Keep the stuff left of the \K, don't include it in $&"</strong></p>
<p>Matcher sans garder.</p>
<p>C’est déjà en soi un <code>lookbehind</code>, l’inclure dans un autre <code>lookbehind</code> était donc tiré par les cheveux.</p>
<h5 id="toc-autres-6">Autres</h5>
<ul>
<li><p>Nouvelle fonction <code>parse_subsignature()</code> qui permet d’aller plus loin dans l’implémentation des signatures</p></li>
<li><p>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)</p></li>
<li><p>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 <strong>8 bits</strong> par opérateur sur les machines <strong>64 bits</strong></p></li>
</ul>
<h4 id="toc-corrections-4">Corrections</h4>
<h5 id="toc-propagation-des-exceptions">Propagation des exceptions</h5>
<p>Correction de la propagation des signaux lorsque <code>$@</code> est forcé à une valeur numérique.</p>
<p>Normalement <code>$@</code> contient le message d’erreur de l’exception. <code>perl -e 'eval { die }; print $@'</code> nous donne <code>Died at -e line 1.</code>. </p>
<p>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 <code>$@</code> est ignorée. </p>
<pre><code class="perl"><span class="n">perl</span> <span class="o">-</span><span class="n">e</span> <span class="s">'$@ = 100; die'</span></code></pre>
<p>donne </p>
<pre><code>Died at -e line 1.
</code></pre>
<p>Or on voudrait quelque chose comme </p>
<pre><code class="perl"><span class="n">perl</span> <span class="o">-</span><span class="n">e</span> <span class="s">'$@ = "100"; die'</span></code></pre>
<p>qui donne </p>
<pre><code>100 ...propagated at -e line 1.
</code></pre>
<p>donne </p>
<pre><code>Died at -e line 1.
</code></pre>
<h5 id="toc-exception-en-lecture-seule-lhistoire-sans-fin">Exception en lecture seule, l’histoire sans fin</h5>
<p>Un correctif sur un problème <em>« amusant »</em>. </p>
<p>Lorsqu’on met la variable <code>$@</code> en read only et qu’une exception se déclenche, perl veut écrire dans <code>$@</code> qui est read-only, ce qui génère une exception qui veut écrire dans <code>$@</code> qui… vous avez compris le problème…</p>
<p>…Et ça se finissait en débordement de pile.</p>
<h5 id="toc-autres-7">Autres</h5>
<ul>
<li>Encore une correction sur les <code>0b…</code> et <code>0x…</code> </li>
</ul>
<h3 id="toc-5314">5.31.4</h3>
<h4 id="toc-améliorations-du-cœur-de-perl-3">Améliorations du cœur de Perl</h4>
<ul>
<li>Une amélioration pour les développeurs qui consiste à pouvoir séparer les étapes de compilation et d’optimisation des expressions rationnelles compilées (<code>qr/.../</code>). Il faut avoir compilé Perl en mode débogage.</li>
</ul>
<h4 id="toc-compilation-4">Compilation</h4>
<ul>
<li>Amélioration du script <code>Configure</code> pour la détection de <code>clang</code> et <strong>C++</strong>.</li>
</ul>
<h4 id="toc-corrections-5">Corrections</h4>
<ul>
<li><p>correction d’une fuite mémoire dans les reconnaissances d’expressions rationnelles avec une chaîne de caractères UTF‑8 ;</p></li>
<li><p>encore du travail sur <code>0x</code> et <code>0b</code>, décidément !</p></li>
</ul>
<h3 id="toc-5315">5.31.5</h3>
<h4 id="toc-améliorations-du-cœur-de-perl-4">Améliorations du cœur de Perl</h4>
<ul>
<li><p>Les variables modifiables ne sont plus autorisées en contexte de constante. Ça signifie que <code>my $var; $sub = sub () { $var };</code>, qui était déprécié depuis <strong>5.22</strong>, produit à présent une erreur si <code>$var</code> est modifié dans une autre partie du code (il faut ajouter un <strong>return</strong>).</p></li>
<li><p>Documentation des piles internes de l’interpréteur Perl</p></li>
<li><p>Documentation mise à jour pour utiliser HTTPD quand c’est possible</p></li>
<li><p>Nettoyage et mise à jour des vieux liens sur les courriels, etc.</p></li>
<li><p>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 <strong>UTF‑8</strong></p></li>
</ul>
<h4 id="toc-compilation-5">Compilation</h4>
<ul>
<li>Amélioration de Configure concernant <code>d_u32align</code> (défaut à oui, car la question n’est posée que sur machine 32 bits) et <code>malloc_usable_size</code>
</li>
</ul>
<h3 id="toc-5316">5.31.6</h3>
<h4 id="toc-améliorations-du-cœur-de-perl-5">Améliorations du cœur de Perl</h4>
<h5 id="toc-script-runs">Script runs</h5>
<p>Les <strong>script run</strong> ne sont plus expérimentales. </p>
<p>Un <strong><em>script run</em></strong> 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 <strong>script Unicode</strong>.</p>
<p>On peut écrire souvent les mêmes choses visuellement pour l’humain mais à partir d’un ensemble différent de caractères Unicode.</p>
<p>C’est assez critique car ça peut mener à du <a href="https://en.wikipedia.org/wiki/Spoofed_URL">spoofing d’url</a>. </p>
<p>Une expression rationnelle dans un script <em>run</em> va vérifier que tout ce qui est lu fait partie du même script.</p>
<h5 id="toc-autres-8">Autres</h5>
<ul>
<li><p>Les assertions alpha ne sont plus expérimentales. Il s’agit des <strong>assertions</strong> d’expressions rationnelles du type <strong><em>lookbehind</em></strong> et <strong><em>lookahead</em></strong> qui sont <strong>non capturantes</strong> (<em>cf.</em> <a href="https://metacpan.org/pod/release/WOLFSAGE/perl-5.31.8/pod/perlre.pod#Lookaround-Assertions">doc</a>)</p></li>
<li><p>La vérification des fonctionnalités est plus rapide</p></li>
<li><p>Perl a migré vers <a href="https://github.com/Perl/perl5">GitHub</a> (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é.</p></li>
<li><p>Un TRÈS gros travail a été fait sur le <strong>lexer</strong>. 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.</p></li>
<li><p>Le code qui gère la <strong>translitération</strong> (<code>tr///</code>) a été retravaillé entièrement avec de nombreux bogues corrigés (Unicode, <code>/s</code>, autres).</p></li>
</ul>
<h4 id="toc-mise-à-jour-des-modules-2">Mise à jour des modules</h4>
<ul>
<li>Un nouvel outil <strong>streamzip</strong> a été ajouté. Il permet de zipper ce qui est envoyé a l’entrée standard.</li>
</ul>
<h4 id="toc-compilation-6">Compilation</h4>
<ul>
<li>Correction d’un bogue dans <code>Configure</code> avec <strong>GCC 10</strong>
</li>
</ul>
<h4 id="toc-corrections-6">Corrections</h4>
<ul>
<li>Une concaténation multiple entre une fonction mal définie et des chaînes lève bien un avertissement.</li>
</ul>
<h3 id="toc-5317">5.31.7</h3>
<h4 id="toc-améliorations-du-cœur-de-perl-6">Améliorations du cœur de Perl</h4>
<ul>
<li><p>Introduction du nouvel opérateur <code>isa</code>. Ça doit parler aux programmeurs Perl puisque depuis looongtemps il existe un module <code>UNIVERSAL</code> 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.</p></li>
<li><p>Une propriété utilisateur dans un bloc de nom Unicode <code>\p{...}</code> sera toujours prioritaire par rapport à une propriété Unicode du même nom.</p></li>
<li><p>L’outil <code>perlbug</code> qui sert à faire des rapports de bogues a été mis à jour pour pointer vers le <a href="https://github.com/Perl/perl5/issues">système de suivi de GitHub</a>.</p></li>
</ul>
<h4 id="toc-mise-à-jour-des-modules-3">Mise à jour des modules</h4>
<ul>
<li>Le module <strong>B::Debug</strong> va bientôt sortir du cœur de Perl mais restera disponible dans le CPAN évidemment. C’est un module purement technique pour <strong>deparser</strong> et comprendre comment notre programme est interprété par <strong>perl</strong>
</li>
</ul>
<h5 id="toc-vstrings">VStrings</h5>
<p>Mise à jour de <strong>Storable</strong> avec un correctif interdisant les <strong>vstring</strong> de plus de deux gibioctets.</p>
<p>Mais au fait, qu’est‑ce qu’une <code>vstring</code> ?</p>
<p>Aucun rapport avec des chaînes qui serviraient à stocker des versions pour du <em>semantic versioning</em>.</p>
<p>C’est une façon d’écrire les chaînes de caractères en donnant leurs codes et en séparant par des <code>.</code> (points).</p>
<p>Avec des <strong>vstring</strong>, on écrit par exemple <code>v1.11;</code> qui est la même chose que <code>chr(1) . chr(11)</code>.</p>
<p>Ça peut produire des résultats surprenants car dans un contexte de comparaison de chaînes (<code>eq</code>), les chaînes <code>v1.11</code> et <code>v1.2</code> sont différentes, mais dans un contexte de comparaison numérique (<code>==</code>) <code>v1.1</code> et <code>v1.2</code> seront évaluées en <code>0</code> et donc la comparaison sera vraie.</p>
<p><code>perl -e 'print v1.2+0'</code> donne <code>0</code> tout comme <code>perl -e 'print v1.1+0'</code> donne <code>0</code></p>
<pre><code class="perl"><span class="k">my</span> <span class="nv">$a</span> <span class="o">=</span> <span class="n">v1</span><span class="mf">.11</span><span class="p">;</span>
<span class="k">my</span> <span class="nv">$aa</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">.</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">11</span><span class="p">);</span>
<span class="k">my</span> <span class="nv">$b</span> <span class="o">=</span> <span class="n">v1</span><span class="mf">.2</span><span class="p">;</span>
<span class="k">my</span> <span class="nv">$bb</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">.</span> <span class="nb">chr</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
<span class="k">print</span> <span class="s">"a == b\n"</span> <span class="k">if</span> <span class="p">(</span><span class="nv">$a</span> <span class="o">==</span> <span class="nv">$b</span><span class="p">);</span>
<span class="k">print</span> <span class="s">"a ne b\n"</span> <span class="k">if</span> <span class="p">(</span><span class="nv">$a</span> <span class="ow">ne</span> <span class="nv">$b</span><span class="p">);</span>
<span class="k">print</span> <span class="s">"a == aa\n"</span> <span class="k">if</span> <span class="p">(</span><span class="nv">$a</span> <span class="o">==</span> <span class="nv">$aa</span><span class="p">);</span>
<span class="k">print</span> <span class="s">"a eq aa\n"</span> <span class="k">if</span> <span class="p">(</span><span class="nv">$a</span> <span class="ow">eq</span> <span class="nv">$aa</span><span class="p">);</span></code></pre>
<p>Qui nous donnera : </p>
<pre><code>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)
</code></pre>
<h4 id="toc-compilation-7">Compilation</h4>
<ul>
<li>Correction pour la compilation sur <strong>Solaris</strong> avec <strong>Oracle Developer Studio compiler</strong>
</li>
</ul>
<h4 id="toc-corrections-7">Corrections</h4>
<ul>
<li><p>Correction <strong>mymalloc</strong> (déjà abordé) sur <strong>Windows</strong></p></li>
<li><p>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.</p></li>
<li><p>Correction d’un bogue concernant les modificateurs d’expression rationnelles <code>/i</code> (insensible à la casse) et <code>/l</code> (locale forcée).</p></li>
<li><p>Problème dans les tests avec <code>make minitest</code>. C’est un jeu de tests exécuté avec <code>miniperl</code>, qui est un interpréteur <code>perl</code> capable de lire et d’exécuter du code Perl avant l’étape d’inclusion des interfaçages <strong>XS</strong>. Il est proposé d’étendre les « <em>smoke tests</em> » à cette cible pour éviter d’ignorer involontairement ce problème.</p></li>
<li><p>Ajout d’une solution de contournement pour corriger un <a href="https://bugs.debian.org/931139">bogue dans glibc sur le changement de locales</a>.</p></li>
</ul>
<h3 id="toc-5318">5.31.8</h3>
<h4 id="toc-améliorations-du-cœur-de-perl-7">Améliorations du cœur de Perl</h4>
<ul>
<li><p>Tout comme pour <code>malloc</code> mentionné plus tôt, perl propose une autre implémentation de <code>strlen</code> appelé <code>my_strlen</code> mais cette fois destinée aux systèmes ne disposant pas pas de <code>strlen</code>. L’implémentation de <code>my_strlen</code> a été optimisée.</p></li>
<li><p>D’autres améliorations de performances sur les fonctions <code>grok_*</code>. Les fonctions <strong>grok</strong> sont des <a href="https://perldoc.pl/perltoc#Numeric-functions">fonctions de conversion</a>.</p></li>
</ul>
<h4 id="toc-documentation">Documentation</h4>
<ul>
<li><p>La documentation ne conseille plus d’utiliser le <code>malloc</code> de Perl. On part du principe que les implémentations modernes de malloc sont meilleures à présent.</p></li>
<li><p>La documentation sur <strong>XS</strong> (interfacage avec code C) suggère aussi d’utiliser <strong>FFI</strong> (autre implémentation plus dynamique) </p></li>
<li><p><strong>Eat your own dog food</strong> en quelque sorte : les exemples dans la doc <strong>perlipc</strong> sont à présent valides avec <code>use warnings; use strict;</code></p></li>
<li><p>Documentation des fonctions <strong>grok</strong></p></li>
</ul>
<h4 id="toc-compilation-8">Compilation</h4>
<ul>
<li><p>Rajout d’includes (<code><stdlib.h></code> et <code><stdio.h></code>) à certaines sondes configurées pour rendre le code plus portable (éviter une erreur de compilation)</p></li>
<li><p>Correction de la compilation de Perl sur <strong>NetBSD 8.0</strong> avec <strong>g++</strong>.</p></li>
<li><p>Configure plus flexible sur <strong>Solaris</strong>, ce qui permet de compiler sur une plus grande variété de configurations <strong>Solaris</strong>.</p></li>
</ul>
<h4 id="toc-corrections-8">Corrections</h4>
<ul>
<li><p>Correction d’un débordement de pile (<em>heap overflow</em>) dans ce genre d’expression rationnelle : <code>q0=~/0|\p{__::Is0}/</code>. 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.</p></li>
<li><p>Correction d’un <em>assertion failed</em> sur les groupes non capturants dans les expressions rationnelles. Pour rappel, un groupe non capturant, <code>(?:...)</code>, et un exemple d’expression rationnelle qui crée cette <em>assertion failed</em> : <code>/(?:0)|(?:)(?:[1-9])/</code></p></li>
<li><p>La fonction de translittération <code>tr///</code> a été beaucoup retouchée en <strong>5.31</strong> et une régression est apparue lorsqu’on utilise le modifier <code>/d</code>. Ce modificateur est un modificateur interne qui permet de simuler un set de caractère ancien (et problématique).</p></li>
<li><p>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.</p></li>
<li><p><strong>IO.xs</strong> devient thread safe </p></li>
</ul>
<h3 id="toc-5319">5.31.9</h3>
<h4 id="toc-améliorations-du-cœur-de-perl-8">Améliorations du cœur de Perl</h4>
<ul>
<li><p>prise en charge d’<strong>Unicode 13</strong> et de nouvelles propriétés Unicode</p></li>
<li><p>On dispose d’un nouvel alias pour les noms Unicode (mais attention, <a href="https://perldoc.pl/5.31.10/perlunicode#Comparison-of-%5CN%7B...%7D-and-%5Cp%7Bname%3D...%7D">on ne peut pas faire les mêmes choses avec l’un ou avec l’autre</a>)</p></li>
<li><p>Arrêt de la prise en charge de <strong>POSIX::mbstowcs</strong> et <strong>POSIX::wcstombs</strong>. Spécification cassée, aucune demande pour ces fonctions (les versions non sécurisées sans « s » restent supportées)</p></li>
<li><p>mise à jour des liens pointant vers <code>search.cpan.org</code> vers <code>metacpan.org</code></p></li>
</ul>
<h4 id="toc-compilation-9">Compilation</h4>
<ul>
<li>Sur <strong>VMS</strong>, avec la publication d’un <em>patch kit</em> récent, de nombreuses nouvelles fonctions sont accessibles (dans <code>stdint.h</code>) et donc utilisées par <code>perl</code>.</li>
</ul>
<h4 id="toc-corrections-9">Corrections</h4>
<h5 id="toc-require-naime-pas-local-inc">require n’aime pas local %INC</h5>
<p>Un correctif sur la valeur de retour de <code>require</code> (un équivalent de <code>use</code> qui s’exécute à l’exécution plutôt qu’à la compilation). Le bogue se produit lorsqu’on <strong>localise</strong> le hash des includes <code>%INC</code>, donc lorsqu’on déclare un <code>%INC</code> <code>local</code>.</p>
<p>Qu’est‑ce que <code>local</code> par rapport a <code>my</code> ?</p>
<p>Une variable déclarée avec <code>my</code> est visible dans le <code>bloc</code> donc <code>{ ... }</code>. On dit qu’elle est <strong>lexicale</strong>.</p>
<p>Une variable déclarée avec <code>local</code> est visible dans l’arbre d’appel.</p>
<pre><code class="perl"><span class="k">my</span> <span class="nv">$out</span> <span class="o">=</span> <span class="s">"out"</span><span class="p">;</span>
<span class="p">{</span>
<span class="k">sub</span> <span class="nf">pin</span><span class="p">()</span> <span class="p">{</span>
<span class="k">print</span> <span class="s">"[pin] in = $in\n"</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">my</span> <span class="nv">$in</span> <span class="o">=</span> <span class="s">"in"</span><span class="p">;</span>
<span class="k">print</span> <span class="s">"[block] in = $in\n"</span><span class="p">;</span> <span class="c1"># Affiche in</span>
<span class="k">print</span> <span class="s">"[block] l = $l\n"</span><span class="p">;</span> <span class="c1"># Affiche rien</span>
<span class="n">lout</span><span class="p">();</span>
<span class="n">pin</span><span class="p">();</span> <span class="c1"># Affiche rien </span>
<span class="p">}</span>
<span class="k">print</span> <span class="s">"[out] out = $out\n"</span><span class="p">;</span> <span class="c1"># Affiche out</span>
<span class="k">print</span> <span class="s">"[out] in = $in\n"</span><span class="p">;</span> <span class="c1"># Affiche rien</span>
<span class="k">sub</span> <span class="nf">lout</span><span class="p">()</span> <span class="p">{</span>
<span class="nb">local</span> <span class="nv">$l</span> <span class="o">=</span> <span class="s">"local"</span><span class="p">;</span>
<span class="n">lin</span><span class="p">();</span>
<span class="p">}</span>
<span class="k">sub</span> <span class="nf">lin</span><span class="p">()</span> <span class="p">{</span>
<span class="k">print</span> <span class="s">"[lin] l = $l\n"</span><span class="p">;</span> <span class="c1"># Affiche local</span>
<span class="p">}</span></code></pre>
<h5 id="toc-autres-9">Autres</h5>
<ul>
<li><p>Correction d’un bogue sur les expressions rationnelles imbriquées qui produisent <strong><em>exceeded limit in regex</em></strong>.</p></li>
<li><p>En mode débogage, la compilation de propriétés Unicode pouvait produire certaines informations étranges, c’est corrigé.</p></li>
</ul>
<h3 id="toc-53110">5.31.10</h3>
<h4 id="toc-améliorations-du-cœur-de-perl-9">Améliorations du cœur de Perl</h4>
<ul>
<li>On peut à présent inclure des expressions rationnelles dans les noms Unicode, par exemple <code>r!\p{na=/(SMILING|GRINNING) FACE/}!</code>
</li>
</ul>
<h5 id="toc-opérateurs-chaînes">Opérateurs chaînes</h5>
<p>Une comparaison chaînée comme <code>$a < $b < $c</code> se comporte comme <code>$a < $b && $b < $c</code> donc en deux temps, mais la valeur de <code>$b</code> n’est pas recalculée (cas d’une variable <em>attachée</em> à une fonction instable par exemple).</p>
<p>Plus d’infos dans la <a href="https://perldoc.pl/5.31.10/perlop#Operator-Precedence-and-Associativity">doc</a>.</p>
<p>Également, on ne pourra pas faire <code>1 .. 6 .. 9</code> car l’opérateur <code>..</code> n’est pas associatif.</p>
<p>Un petit fil de discussion sympa sur le sujet montre que le problème n’est <a href="https://github.com/Perl/perl5/issues/17692">pas tout à fait tranché</a>.</p>
<h3 id="toc-53111">5.31.11</h3>
<p>La version <strong>5.31.11</strong> est une rc, elle est livrée par <strong>Sawyer X</strong> (qui est le pumpking actuel des versions majeures de Perl).</p>
<p><strong>blead</strong> est gelée. </p>
<p><strong>5.31.11</strong> sert de base pour corriger les points bloquants avant <strong>5.32.0</strong></p>
<p>Un peu avant la sortie de perl <strong>5.32.0</strong>, voici a quoi ressemble la « liste de points bloquants » :<br>
<img src="//img.linuxfr.org/img/68747470733a2f2f692e696d6775722e636f6d2f556261543955472e706e67/UbaT9UG.png" alt="Points bloquants" title="Source : https://i.imgur.com/UbaT9UG.png"></p>
<h3 id="toc-5320-rc0">5.32.0-RC0</h3>
<p>Sortie de la RC0 le 30 mai 2020 (<a href="https://www.nntp.perl.org/group/perl.perl5.porters/2020/05/msg257486.html">annonce</a>).</p>
<h3 id="toc-5320-rc1">5.32.0-RC1</h3>
<p>Sortie le 7 juin 2020 (<a href="https://www.nntp.perl.org/group/perl.perl5.porters/2020/06/msg257521.html">annonce</a>).</p>
<h3 id="toc-5320">5.32.0</h3>
<p>Voici donc l’<a href="https://www.nntp.perl.org/group/perl.perl5.porters/2020/06/msg257547.html">annonce de la sortie de Perl 5.32.0</a>, que nous avons disséqué en long en large dans cette dépêche. :)</p>
<p>\o/ Tadaaa ! </p>
<h3 id="toc-conclusion">Conclusion</h3>
<p>Pour terminer, juste une image pour remercier votre courage/abnégation d’avoir lu/scrollé jusqu’ici :) </p>
<p>J’espère pour vous que vous n’avez pas lu cette dépêche à haute voix… </p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f692e696d6775722e636f6d2f4648574f4838562e706e67/FHWOH8V.png" alt="Lire du Perl à voix haute invoque Cthulhu" title="Source : https://i.imgur.com/FHWOH8V.png"></p>
</div><div><a href="https://linuxfr.org/news/sortie-de-perl-5-32-0.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/120659/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/sortie-de-perl-5-32-0#comments">ouvrir dans le navigateur</a>
</p>
contra-shtheojouedubanjoDavy DefaudBenoît Sibaudbarmic 🦦bistouilleXavier Teyssierpalm123claudexVroumZeroHeureYsabeau 🧶 🧦dourouc05Olivier LEMAIREhttps://linuxfr.org/nodes/120659/comments.atomtag:linuxfr.org,2005:Bookmark/17092020-06-25T02:07:50+02:002020-06-25T02:07:50+02:00Announcing Perl 7<a href="https://www.perl.com/article/announcing-perl-7/">https://www.perl.com/article/announcing-perl-7/</a> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/120895/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/deuzene/liens/announcing-perl-7#comments">ouvrir dans le navigateur</a>
</p>
deuzenehttps://linuxfr.org/nodes/120895/comments.atomtag:linuxfr.org,2005:Diary/386022019-07-19T00:07:05+02:002019-07-19T19:02:59+02:00TapTempo en une ligneLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>En lisant une <a href="//linuxfr.org/news/debian-10-buster-une-distribution-qui-a-du-chien">dépêche du moment</a> je découvre en passant le <a href="//linuxfr.org/users/mzf/journaux/un-tap-tempo-en-ligne-de-commande">logiciel TapTempo</a>. En lisant la description du comportement, par réflexe je me suis dit "tiens ça doit rentrer dans une ligne un algo de ce genre".</p>
<pre><code class="perl"><span class="n">perl</span> <span class="o">-</span><span class="ow">ne</span> <span class="s">'BEGIN{use Time::HiRes qw/gettimeofday/} push(@t,0+gettimeofday()); shift(@t) if @t>5; printf("%3.0f bpm",60*(@t-1)/($t[-1]-$t[0])) if @t>1'</span></code></pre>
<p>Bon ça ne marque qu'avec la touche <strong>Entrée</strong>, pas avec n'importe quelle touche, mais ça affiche bien le BPM en moyennant les 5 dernières valeurs. Et ça rentre dans un tweet (sans compter l'invocation de l'interpréteur : 138 caractères).</p>
<p>Je décompose le mouvement :</p>
<p><code>perl -ne</code> : le flag <code>-e</code> indique que le code va être passé dans l'argument suivant; le flag <code>-n</code> indique que ce code sera exécuté pour chaque ligne reçu via stdin, et dans notre cas la source sera la console et la fin de ligne par défaut le retour chariot.</p>
<p><code>BEGIN{use Time::HiRes qw/gettimeofday/}</code> : de loin la partie la plus verbeuse, mais il faut bien appeler les choses par leur nom. Le module <code>Time::HiRes</code> et un "Perl core module", donc si vous avez l'interpréteur vous êtes sûr que vous avez ce module (sauf sur les distros qui aiment vous embrouiller comme CentOS/RHEL). Ensuite on importe la fonction qui nous intéresse dans l'espace de nommage de notre programme pour ne pas avoir à l'invoquer avec la syntaxe java-esque <code>Time::HiRes::gettimeofday</code>. Notez qu'il manque l'aliasing à la Python pour renommer une fonction importée, j'aurai bien aimé renommer <code>gettimeofday</code> en <code>gtod</code> (ça existe, mais pas en core module à ma connaissance). Comme le one-liner est invoqué à chaque ligne d'input, on limite l'invocation de cet import à la compilation avec <code>BEGIN</code> (oui : à la compilation, pas au début de l'exécution, mais dans ce billet vous avez le droit d'ignorer ce détail).</p>
<p><code>push(@t,0+gettimeofday())</code> : j'utilise la liste <code>@t</code> sans l'intialiser, c'est MAL mais c'est un one-liner hein, tout est permis. Mais le comportement est défini, je sais que la liste est initialement vide, je gère les risques. On relève l'heure et on l'empile à la fin de la liste. Le <code>0+</code> est un hack totalement légal et courant pour forcer le résultat de la fonction à être une valeur numérique. Sinon ça renvoie un tuple, cf. <a href="https://perldoc.perl.org/Time/HiRes.html">ligne 12 de l'exemple sur la doc</a>.</p>
<p><code>shift(@t) if @t>5</code> : je limite la taille de la liste à 5 éléments en retirant le premier élément si nécessaire (ma liste est donc utilisée en FIFO, je garde les 5 dernières mesures sur une fenêtre de temps glissante). Notez que l'opérateur de comparaison est numérique (en Perl on donc le pendant alphanumérique qui est <code>gt</code>) et force Perl à considérer <code>@t</code> comme le nombre d'éléments de la liste au lieu de la liste elle-même. Perl est un langage où le contexte intervient tout le temps et si vous dépassez vos premières impressions (c'est ambigu/magique/nimp), vous pourrez découvrir que c'est un moyen d'expressivité dont on a du mal à se passer dans les autres langages.</p>
<p><code>60*(@t-1)/($t[-1]-$t[0])</code> : si vous voulez faire la moyenne des deltas entre chaque mesure successive, vous constaterez facilement que le calcul se résume à faire le delta uniquement entre la première et dernière mesure (et cet algo simple m'arrangeait, même si ergonomiquement on tend à préférer des moyennes exponentiellement lissées comme par ex. la fameuse mesure du <strong>load</strong> Unix). En perl l'index -1 d'une liste permet d'obtenir le dernier élément. Au fait, si on a N échantillons, on a N-1 mesures, d'où le facteur <code>@t-1</code>. Pour passer des Hz obtenus naturellement à partir du chronométrage en secondes au BPM, ben on multiplie par 60.</p>
<p><code>printf("%3.0f bpm",...) if @t>1</code> : il faut bien afficher le résultat, on le justifie sur 3 colonnes et on demande 0 décimales. Détail amusant, on n'affiche pas le retour chariot car votre console va afficher celui que vous avez saisi, et il y a donc une race condition (mais je vous souhaite bonne chance pour appuyer plus vite sur Entrée que l'interprétation de la ligne par Perl). Il faut au moins deux échantillons pour avoir une mesure, et dans le monde merveilleux des entiers, "avoir au moins deux" peut aussi se dire "avoir strictement plus que un". J'ai pris la notation la plus courte.</p>
<p>Voilà. Et du coup faire un one-liner qui donne un journal de 100 lignes, c'est fatiguant en fait.</p>
<p><strong>PS</strong> : merci à <a href="//linuxfr.org/users/mzf">François Mazen</a> de m'avoir suggéré d'en faire un journal. Il m'a rappelé qu'il existait des portages Perl de TapTempo :<br>
* <a href="//linuxfr.org/users/astaoth/journaux/portage-de-taptempo-en-perl">https://linuxfr.org/users/astaoth/journaux/portage-de-taptempo-en-perl</a><br>
* <a href="//linuxfr.org/users/glaeken/journaux/portage-de-taptempo-en-perl6">https://linuxfr.org/users/glaeken/journaux/portage-de-taptempo-en-perl6</a></p>
<div><a href="https://linuxfr.org/users/zerodeux/journaux/taptempo-en-une-ligne.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/117728/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/zerodeux/journaux/taptempo-en-une-ligne#comments">ouvrir dans le navigateur</a>
</p>
zerodeuxhttps://linuxfr.org/nodes/117728/comments.atomtag:linuxfr.org,2005:News/393352019-07-10T09:14:42+02:002019-07-12T13:24:39+02:00Pour tout savoir du Perl post‐moderneLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Cette dépêche est un complément de <a href="//linuxfr.org/news/sortie-de-perl-5-30-0">celle qui retrace l’histoire de Perl</a> à l’occasion de la sortie de la version 5.30. Elle se concentre sur les ressources : documentation, tutoriels, folklore, outils pour découvrir et développer en Perl.</p>
<p>Pour rappel, <a href="https://www.perl.org/">Perl</a> est un langage généraliste créé en 1987 par <a href="https://fr.wikipedia.org/wiki/Larry_Wall">Larry Wall</a>. « <em>Perl continue de prospérer dans sa troisième décennie grâce à une communauté d’utilisateurs et de développeurs très dynamique.</em> », <em>dixit</em> <a href="https://metacpan.org/pod/distribution/perl/pod/perldelta.pod#Acknowledgements">perldelta</a>. Perl est distribué sous une double licence : <a href="https://opensource.org/licenses/Artistic-2.0">Artistic Licence</a> et <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPL v1+</a>. La plupart des modules du CPAN <a href="https://www.cpan.org/misc/cpan-faq.html#How_is_Perl_licensed">suivent également ce même traitement</a>.<br>
<img src="//img.linuxfr.org/img/68747470733a2f2f63616d6f2e67697468756275736572636f6e74656e742e636f6d2f303339633062373730666461666630663134313863356166613432393664666162613566323837352f36383734373437303733336132663266373236313737326536373639373436383735363232653633366636643266366237323631363936383266373036353732366332643732363137303734366637323266366436313733373436353732326636353738363136643730366336353265373036653637/68747470733a2f2f7261772e6769746875622e636f6d2f6b726169682f7065726c2d726170746f722f6d61737465722f6578616d706c652e706e67" alt="Perl 5 raptor" title="Source : https://camo.githubusercontent.com/039c0b770fdaff0f1418c5afa4296dfaba5f2875/68747470733a2f2f7261772e6769746875622e636f6d2f6b726169682f7065726c2d726170746f722f6d61737465722f6578616d706c652e706e67"> <em>Perl 5 raptor de <a href="https://github.com/kraih/perl-raptor">kraih</a>, licence <a href="https://creativecommons.org/licenses/by-sa/4.0/">CC-BY-SA 4.0</a></em></p>
</div><ul><li>lien nᵒ 1 : <a title="https://www.perl.org/" hreflang="fr" href="https://linuxfr.org/redirect/104474">Perl</a></li><li>lien nᵒ 2 : <a title="https://metacpan.org/" hreflang="fr" href="https://linuxfr.org/redirect/104475">MetaCPAN</a></li><li>lien nᵒ 3 : <a title="https://linuxfr.org/news/sortie-de-perl-5-30-0" hreflang="fr" href="https://linuxfr.org/redirect/104476">Sortie de Perl 5.30.0</a></li></ul><div><h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li>
<a href="#toc-liens-utiles">Liens utiles</a><ul>
<li><a href="#toc-d%C3%A9veloppement-de-perlcore">Développement de Perl core</a></li>
<li><a href="#toc-officiel">Officiel</a></li>
<li><a href="#toc-modules-et-installeurs">Modules et installeurs</a></li>
<li><a href="#toc-g%C3%A9n%C3%A9ral">Général</a></li>
<li><a href="#toc-autour-du-cpan">Autour du CPAN</a></li>
<li><a href="#toc-social">Social</a></li>
<li><a href="#toc-docs-officielles">Docs officielles</a></li>
<li><a href="#toc-tutoriels">Tutoriels</a></li>
<li><a href="#toc-tutoriels-en-fran%C3%A7ais">Tutoriels en français</a></li>
<li><a href="#toc-tutos-interactifs">Tutos interactifs</a></li>
<li><a href="#toc-m%C3%A9tasite-qui-liste-les-tutoriels">Méta‐site qui liste les tutoriels</a></li>
<li><a href="#toc-folklore-autour-de-perl">Folklore autour de Perl</a></li>
<li><a href="#toc-%C3%89cosyst%C3%A8me-perl">Écosystème Perl</a></li>
<li><a href="#toc-ex%C3%A9cution-de-code-perl-enligne">Exécution de code Perl en ligne</a></li>
<li><a href="#toc-ex%C3%A9cution-de-code-perl-enligne-sites-nonsp%C3%A9cifiques-%C3%A0perl">Exécution de code Perl en ligne (sites non spécifiques à Perl)</a></li>
</ul>
</li>
<li>
<a href="#toc-d%C3%A9velopper-avec-perl">Développer avec Perl</a><ul>
<li><a href="#toc-installer-des-modules-du-cpan">Installer des modules du CPAN</a></li>
<li><a href="#toc-les-linters">Les linters</a></li>
<li><a href="#toc-comment-compiler-perl">Comment compiler perl</a></li>
<li>
<a href="#toc-compiler-les-modules">Compiler les modules</a><ul>
<li><a href="#toc-extutilsmakemaker">ExtUtils::MakeMaker</a></li>
<li><a href="#toc-modulebuild">Module::Build</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="toc-liens-utiles">Liens utiles</h2>
<p>Les paragraphes qui suivent concernant les liens n’ont pas pour but d’être <em>exhaustifs</em> mais plutôt de fournir des pointeurs vers des ressources ou d’attiser votre curiosité. </p>
<h3 id="toc-développement-de-perlcore">Développement de Perl core</h3>
<ul>
<li>
<a href="https://perl5.git.perl.org/perl.git">perl.git</a>, là où se trouve le <strong>code de l’interpréteur Perl</strong> et son <a href="https://github.com/Perl/perl5">miroir sur GitHub</a> ;</li>
<li>
<a href="https://rt.perl.org/Public/Search/Results.html?Query=Queue%20=%20%27perl5%27%20AND%20(Status%20=%20%27new%27%20OR%20Status%20=%20%27open%27%20OR%20Status%20=%20%27stalled%27)">le gestionnaire de tickets de Perl 5</a> (utilise le logiciel Perl <a href="https://bestpractical.com/request-tracker">Request Tracker</a> le gestionnaire de tickets/patchs) ;</li>
<li>
<a href="https://lists.gt.net/perl/porters/">liste Perl porters</a> ;</li>
<li>
<a href="https://metacpan.org/pod/distribution/perl/INSTALL">compiler et installer Perl</a> à la main (si on ne veut pas du Perl vendor) ;</li>
<li>
<a href="https://metacpan.org/source/XSAWYERX/perl-5.30.0/pod">perldelta 5.30.0</a> dernier journal des modifications ;</li>
<li>
<a href="https://perldoc.perl.org/perlhist.html">historique très détaillé des versions de Perl</a> ;</li>
<li>
<a href="https://metacpan.org/pod/distribution/perl/pod/perldeprecation.pod">dépréciations</a> ;</li>
<li>
<a href="https://perldoc.perl.org/perlport.html">portabilité</a>.</li>
</ul>
<h3 id="toc-officiel">Officiel</h3>
<ul>
<li>
<em><a href="https://www.perl.org/">perl.org</a></em>, la « maison » de Perl ;</li>
<li>
<a href="https://www.perlfoundation.org/">Perl Fundation</a>, la fondation Perl ;</li>
<li>
<a href="https://www.perl.org/advocacy/white_camel/">White Camel Awards</a>, récompense annuelle pour des personnes ayant contribué de manière importante à Perl. Et ce pas forcément avec du code !</li>
</ul>
<h3 id="toc-modules-et-installeurs">Modules et installeurs</h3>
<ul>
<li>installeur de modules moderne <a href="https://metacpan.org/pod/distribution/App-cpanminus/bin/cpanm">cpanm</a>, par <a href="https://github.com/miyagawa">Tatsuhiko Miyagawa</a> (<a href="https://metacpan.org/author/MIYAGAWA">profil CPAN</a>) ;</li>
<li>
<a href="https://perlbrew.pl/">gestionnaire de version Perlbrew</a> ;</li>
<li>un autre gestionnaire de binaire Perl <a href="https://github.com/tokuhirom/plenv">plenv</a>. <a href="https://weblog.bulknews.net/plenv-alternative-for-perlbrew-7b5bf00a419e">Différences entre perlbrew et plenv</a>.</li>
<li>bundler pour Perl : <a href="https://github.com/perl-carton/carton">Perl carton</a> qui utilise <a href="https://github.com/miyagawa/cpanfile">cpanfile</a> ;</li>
<li>liste de modules reconnus <a href="https://github.com/EnlightenedPerlOrganisation/task-kensho">Task::Kensho</a> ;</li>
<li>
<a href="http://corelist.rpee.be/">Corelist</a>, interface Web de l’outil <strong>Corelist</strong> qui permet de connaître les <em>core modules</em> inclus dans une version de Perl.</li>
</ul>
<h3 id="toc-général">Général</h3>
<ul>
<li>
<a href="https://www.perlmonks.org/">Perl Monks</a>, le <em>Stack Overflow</em> de Perl à moins que <em>stackoverflow</em> soit le <em>perlmonks</em> généraliste :D (OK, on n’est pas vendredi, je sors) ;</li>
<li>
<a href="https://www.perlmonks.org/">Perl Monks… <strong>encore</strong></a>, parce que c’est vraiment bien, même si ça ressemble à une grotte ;</li>
<li>
<a href="https://perldoc.perl.org/">Perldoc (<em>perl.org</em>)</a> et <a href="https://perldoc.pl">Perldoc (<em>perldoc.pl</em>)</a> ;</li>
<li>
<a href="https://perldoc.perl.org/5.30.0/index-modules-A.html">liste de core modules</a> ;</li>
<li>
<a href="http://deps.cpantesters.org/">lister les dépendances d’un module CPAN</a> ;</li>
<li>
<a href="http://prepan.org/">discussion sur les modules avant la mise sur CPAN</a> ;</li>
<li>
<a href="https://fr.perlmaven.com/">Perl Maven</a>, un énorme site sur Perl ;</li>
<li>
<em><a href="http://perlmeme.org/">perlmeme.org</a></em>, un site sur Perl (tutoriels, FAQ et autres).</li>
</ul>
<h3 id="toc-autour-du-cpan">Autour du CPAN</h3>
<ul>
<li>[NOUVEAU] <a href="https://cpandoc.grinnz.com/">CPANdoc</a>, doc de modules importants ;</li>
<li>
<a href="http://cpantesters.org/">CPAN Testers</a>, un site pour gérer les contructions et rapports de test des modules CPAN ;</li>
<li>
<a href="http://mapofcpan.org">CPAN map</a>, carte des espaces de noms CPAN ;</li>
<li>
<a href="http://cpancover.com">CPAN Cover</a>, couverture de test des modules CPAN ;</li>
<li>
<a href="https://cpants.cpanauthors.org/">CPAN TS</a>, Kwalitee métriques ;</li>
<li>
<a href="http://cpan.io/">CPAN IO</a> classement des auteurs CPAN selon leur activité.</li>
</ul>
<h3 id="toc-social">Social</h3>
<ul>
<li>
<a href="https://www.reddit.com/r/perl/">Perl reddit</a> ;</li>
<li>
<a href="http://blogs.perl.org/">site de blogs sur Perl</a> ;</li>
<li>
<a href="https://www.pm.org/">Perl Mongers</a> ;</li>
<li>
<a href="http://www.mongueurs.net/">les mongueurs de Perl FR</a> ;</li>
<li>
<em><a href="http://niceperl.blogspot.com/">Nice Perl blog</a></em> ;</li>
<li>
<a href="http://perlweekly.com/">newsletter hebdomadaire</a> ;</li>
<li>
<em><a href="https://perlhacks.com/">Perl Hacks</a></em>, blog ;</li>
<li>
<em><a href="http://perlsphere.net/">Perlsphere</a></em>, agrégateur de blogs ;</li>
<li>conférences <a href="https://fr.wikipedia.org/wiki/Yet_Another_Perl_Conference"><em>Yet Another Perl Conference</em></a> <a href="https://www.yapc.org/">YAPC</a>, <a href="http://www.yapceurope.org/">YAPC Europe</a>, les <a href="https://journeesperl.fr/jp2019/">journées Perl</a> et également <a href="http://www.osdc.fr/">OSDC</a> (un peu mort, on dirait) ;</li>
<li>des <a href="https://perldoc.perl.org/5.30.0/perlcommunity.html#IRC">canaux IRC</a>, notamment pour les mongueurs français, mojolicious, dancer, catalyst, etc. ;</li>
<li>
<em><a href="https://www.perl.com/">Perl.com</a></em>, domaine récent (malgré son nom…), un fil d’actualités ;</li>
<li>
<em><a href="https://perlbuzz.com/">Perlbuzz</a></em>, un fil d’actualités.</li>
</ul>
<h3 id="toc-docs-officielles">Docs officielles</h3>
<ul>
<li>
<a href="https://perldoc.perl.org/perlfaq.html">Perl FAQ</a> ;</li>
<li>
<a href="https://perldoc.perl.org/perlbook.html">des livres</a> à propos de Perl : <img src="//img.linuxfr.org/img/68747470733a2f2f692e696d6775722e636f6d2f5a3346333458512e6a7067/Z3F34XQ.jpg" alt="Des livres sur Perl" title="Source : https://i.imgur.com/Z3F34XQ.jpg"> <em>Mon étagère de livres sur Perl — licence CC BY SA</em>
</li>
<li>
<a href="https://perldoc.perl.org/perlre.html">perlre</a>, la doc des expressions rationnelles ainsi que le <a href="https://perldoc.perl.org/perlretut.html">tuto</a> et le <a href="https://perldoc.perl.org/perlrequick.html"><em>quick start</em></a> <img src="//img.linuxfr.org/img/687474703a2f2f696d67732e786b63642e636f6d2f636f6d6963732f7065726c5f70726f626c656d732e706e67/perl_problems.png" alt="Perl regex" title="Source : http://imgs.xkcd.com/comics/perl_problems.png"> <em>D’après</em> <a href="https://xkcd.com/1171/">xkcd</a> <em>— Licence CC BY NC</em>
</li>
<li>la <a href="https://perldoc.perl.org/perlop.html">liste des opérateurs</a> et des <a href="https://perldoc.perl.org/perlfunc.html">fonctions <em>built‑in</em></a> ;</li>
<li>
<a href="https://perldoc.perl.org/perlmod.html">écriture des modules / paquets</a> ou encore <a href="https://perldoc.perl.org/perlmodlib.html"><em>ici</em></a>, écrire un <a href="https://perldoc.perl.org/perlnewmod.html">nouveau module</a>, conseils pour <a href="https://perldoc.perl.org/perlmodstyle.html">respecter le style</a> dans les modules ;</li>
<li>doc sur la <a href="https://perldoc.perl.org/perlsyn.html">syntaxe Perl</a> ;</li>
<li>les <a href="https://perldoc.perl.org/perlref.html">références</a> et le <a href="https://perldoc.perl.org/perlreftut.html">tutoriel</a> ;</li>
<li>la <a href="https://perldoc.perl.org/perlipc.html">doc sur les IPC</a> ;</li>
<li>la <a href="https://perldoc.perl.org/perlsec.html">sécurité dans Perl</a> : <em>taint checking</em> (ou « <em>data flow analysis</em> »), <em>setuid</em>, <em>clean PATH</em>, protection des attaque de complexité algorithmiques ;</li>
<li>la doc sur la <a href="https://perldoc.perl.org/perlform.html">génération de rapports grâce aux formats</a> — les <em>formats</em> sont une des raisons de la création de Perl, mais restent limités et beaucoup moins utilisés ;</li>
<li>doc du <a href="https://perldoc.perl.org/perldebug.html">débogueur</a> ; le débogueur de Perl est lui‐même écrit en Perl ;) ;</li>
<li>orienté objet avec Perl ? Doc <a href="https://perldoc.perl.org/perlobj.html">perlobj</a> et <a href="https://perldoc.perl.org/perlootut.html">tuto oo</a>.</li>
</ul>
<h3 id="toc-tutoriels">Tutoriels</h3>
<ul>
<li>
<em><a href="https://perlmaven.com/perl-tutorial">Perl maven</a></em> ;</li>
<li>
<em><a href="https://qntm.org/files/perl/perl.html">Learn Perl in about 2 hours and 30 minutes</a></em> ;</li>
<li>
<em><a href="http://mvp.kablamo.org/">Minimum Viable Perl (MVP)</a></em> ;</li>
<li>
<em><a href="http://perl-begin.org/">Perl-begin</a></em> ;</li>
<li>
<em><a href="https://perl101.org/">Perl101</a></em> ;</li>
<li>
<em><a href="https://www.tutorialspoint.com/perl/">Perl tutorialpoints</a></em>;</li>
<li>
<em><a href="https://www.perltutorial.org/">Perl tutorial</a></em> ;</li>
<li>
<em><a href="https://www.guru99.com/perl-tutorials.html">Perl in 1 day guru99</a></em>.</li>
</ul>
<h3 id="toc-tutoriels-en-français">Tutoriels en français</h3>
<ul>
<li>
<a href="http://formation-perl.fr/guide-perl.html"><em>Guide Perl</em></a> ;</li>
<li>
<a href="http://formation-perl.fr/"><em>Formation-Perl</em></a> ;</li>
<li>
<a href="https://lhullier.developpez.com/tutoriels/perl/intro/"><em>Guide de programmation pour apprendre Perl</em></a> ;</li>
<li>
<a href="http://sdz.tdct.org/sdz/apprenez-a-programmer-en-perl.html">site du zéro</a> ;</li>
<li>
<a href="https://perso.univ-rennes1.fr/francois.dagorn/perl/">cours de l’Université de Rennes</a>.</li>
</ul>
<h3 id="toc-tutos-interactifs">Tutos interactifs</h3>
<ul>
<li>
<a href="http://perltuts.com/tutorials/quick-start/hello-world"><em>Perltuts</em></a> ;</li>
<li>
<a href="https://www.learn-perl.org/"><em>Learn Perl</em></a> ;</li>
<li>
<a href="http://tryperl.pl">tutoriel tryperl.pl</a>.</li>
</ul>
<h3 id="toc-métasite-qui-liste-les-tutoriels">Méta‐site qui liste les tutoriels</h3>
<ul>
<li>
<a href="http://perl-tutorial.org/"><em>Perl tutorial meta site</em></a>.</li>
</ul>
<h3 id="toc-folklore-autour-de-perl">Folklore autour de Perl</h3>
<ul>
<li>« perl » et « Perl » : <strong>Perl</strong> est le langage, <strong>perl</strong> en est l’interpréteur ;</li>
<li>JAPH : <a href="https://en.wikipedia.org/wiki/Just_another_Perl_hacker"><em>Just Another Perl Hacker</em></a> ;</li>
<li>les opérateurs secrets et leurs petits surnoms : <a href="https://metacpan.org/pod/distribution/perlsecret/lib/perlsecret.pod">PerlSecret</a> ;</li>
<li>ce pourquoi certains détestent ou adorent Perl (entre autres) : <a href="https://perldoc.perl.org/perlvar.html">les variables magiques</a> ;</li>
<li>TIMTOWDY : <a href="https://en.wikipedia.org/wiki/Just_another_Perl_hacker"><em>There’s more than one way to do it</em></a> ;</li>
<li>
<a href="https://www.perlmonks.org/?node_id=663393"><em>Seul perl peut parser Perl</em></a> ou bien <a href="https://metacpan.org/pod/PPI#Background">PPI</a> ;</li>
<li>la poésie Perl et, par exemple, le poème <a href="https://fr.wikipedia.org/wiki/Black_Perl"><em>Black Perl</em></a> de Larry Wall ;</li>
<li>[DEAD] <a href="http://perlgolf.sourceforge.net/">Perlgolf</a> (code golf) ;</li>
<li>Les <a href="https://www.brainyquote.com/fr/citation/larry-wall_141510">trois vertus du programmeur : paresse, impatience et orgueil</a> ;</li>
<li>Le logo dromadaire de Perl (tiré du livre <em>Programming Perl</em> chez O’Reilly Media) (licence <em>Artistic License</em>) :
<img src="//img.linuxfr.org/img/68747470733a2f2f75706c6f61642e77696b696d656469612e6f72672f77696b6970656469612f656e2f302f30302f5065726c2d63616d656c2d736d616c6c2e706e67/Perl-camel-small.png" alt="Chameau" title="Source : https://upload.wikimedia.org/wikipedia/en/0/00/Perl-camel-small.png">
</li>
<li>le logo oignon (licence <em>Artistic License</em>) :
<img src="//img.linuxfr.org/img/68747470733a2f2f75706c6f61642e77696b696d656469612e6f72672f77696b6970656469612f656e2f612f61342f4f6e696f6e5f36347836342e706e67/Onion_64x64.png" alt="Oignon" title="Source : https://upload.wikimedia.org/wikipedia/en/a/a4/Onion_64x64.png">
</li>
</ul>
<h3 id="toc-Écosystème-perl">Écosystème Perl</h3>
<ul>
<li>on dit généralement que la <em>killer app</em> Perl est le <a href="https://www.cpan.org/">CPAN</a> (<a href="https://metacpan.org/">metaCPAN</a>) ;</li>
<li>
<a href="http://www.yabbforum.com/">YaBB</a>, moteur de forum ;</li>
<li>
<a href="https://www.everything2.com/">Everything Engine</a>, moteur de site d’actualités et site de questions‐réponses (qui fait tourner PerlMonks) ;</li>
<li>
<a href="https://github.com/SoylentNews/slashcode">Slashcode</a>, moteur de site d’actualités et site de questions‐réponses (qui fait tourner Slashdot) ;</li>
<li>
<a href="https://www.movabletype.org/">Movable Type</a>, système de gestion de contenu ;</li>
<li>
<a href="http://munin-monitoring.org/">Munin</a>, logiciel de supervision comme Nagios et Shinken ;</li>
<li>
<a href="https://www.bugzilla.org/">BugZilla</a>, outil de suivi de bogues ( projet <a href="https://github.com/bugzilla/bugzilla">GitHub</a>) ;</li>
<li>
<a href="https://github.com/fglock/Perlito">Perl to Java et Perl to JavaScript, compilateur Perlito</a>.</li>
<li>
<a href="http://pdl.perl.org/">PDL</a>, pour le calcul scientifique ;</li>
<li>
<a href="https://mojolicious.org/">Mojolicious</a>, cadriciel Web complet (plus bibliothèques) créé par <a href="https://github.com/kraih">Sebastian Riedel</a> (<a href="https://metacpan.org/author/SRI">profil CPAN</a>) ;</li>
<li>
<a href="http://www.catalystframework.org/">Catalyst</a>, cardiciel Web complet ;</li>
<li>
<a href="http://perldancer.org/">Dancer</a>, cadriciel Web minimaliste créé par <a href="https://metacpan.org/author/SUKRIA">Alexis Sukrieh</a> ;</li>
<li>[NOUVEAU] <a href="https://taustation.space/">Tau Station</a>, un jeu d’aventure spatiale en mode texte ;</li>
<li>
<a href="https://fr.wikipedia.org/wiki/Frozen_Bubble">Frozen Bubble</a>, un jeu très connu ;</li>
<li>
<a href="https://awstats.sourceforge.io/">AWStats</a>, analyse des journaux de serveurs Web (projet sur <a href="https://github.com/eldy/awstats">GitHub</a>) ;</li>
<li>
<a href="http://blosxom.sourceforge.net/">Bloxsom</a>, moteur de blog ;</li>
<li>
<a href="https://oddmuse.org/">Oddmuse</a>, un moteur de wiki ;</li>
<li>
<a href="https://olivier.dossmann.net/wiki/archives/web/ikiwiki/">Ikiwiki</a>, un wiki ;</li>
<li>
<a href="https://twiki.org/">TWiki</a>, un autre wiki ;</li>
<li>
<a href="http://act.mongueurs.net/">ACT</a> (projet sur <a href="https://github.com/book/Act">GitHub</a>), une sorte de système de gestion de contenu pour les conférences ;</li>
<li>
<a href="http://preaction.me/statocles/">Statocles</a>, un moteur de blog statique (<a href="https://github.com/preaction/Statocles">code source</a>) ;</li>
<li>
<a href="https://github.com/linkdd/plstblog">Plstblog</a>, un moteur de blog statique <a href="//linuxfr.org/users/linkdd/journaux/plstblog-un-g%C3%A9n%C3%A9rateur-de-blog-statique-%C3%A9crit-en-perl">écrit par une moule LinuxFr</a> ;</li>
<li>
<a href="https://github.com/tnalpgge/rank-amateur-cowsay">Cowsay</a>, la vache qui parle (mon terminal — licence CC BY SA) <img src="//img.linuxfr.org/img/68747470733a2f2f692e696d6775722e636f6d2f49534d796c62772e706e67/ISMylbw.png" alt="Exemple Cowsay" title="Source : https://i.imgur.com/ISMylbw.png">
</li>
<li>
<a href="https://duck.co/ia">DuckDuckGo Instant Answer</a> (projet <a href="https://github.com/duckduckgo/duckduckgo">GitHub</a>, un moteur de site de questions‐réponses ;</li>
<li>une partie d’<a href="https://build.opensuse.org/">openSUSE Buid Service</a> (<a href="https://github.com/openSUSE/obs-build">GitHub d’OBS build scripts</a> et <a href="https://github.com/openSUSE/open-build-service/tree/master/src/backend">OBS backend</a>) et d’autres repos sur le <a href="https://github.com/openSUSE">GitHub d’openSUSE</a> ; la plate‐forme <em>Open Build Service</em>* est une infrastructure qui permet de construire des paquets pour plusieurs gestionnaires de paquets, plusieurs distributions et plusieurs architectures.</li>
</ul>
<h3 id="toc-exécution-de-code-perl-enligne">Exécution de code Perl en ligne</h3>
<ul>
<li>[NOUVEAU] <a href="https://perlbanjo.com/"><em>PerlBanjo.com</em></a> <3 ;</li>
<li>
<a href="https://webperl.zero-g.net/">WebPerl</a> WebAssembly + Emscripten (<a href="https://webperl.zero-g.net/democode/index.html">démo</a> et <a href="https://github.com/haukex/webperl">source</a>) ;</li>
<li>
<a href="https://tio.run/#perl5">TIO</a> ;</li>
<li>
<a href="https://perl.bot/">Perlbot</a>.</li>
</ul>
<h3 id="toc-exécution-de-code-perl-enligne-sites-nonspécifiques-àperl">Exécution de code Perl en ligne (sites non spécifiques à Perl)</h3>
<ul>
<li>
<em><a href="https://www.tutorialspoint.com/execute_perl_online.php">tutorialpoints</a></em> ;</li>
<li>
<em><a href="https://rextester.com/l/perl_online_compiler">Rextester</a></em> ;</li>
<li>
<em><a href="https://www.jdoodle.com/execute-perl-online">JDoodle</a></em> ;</li>
<li>
<em><a href="https://paiza.io/en/projects/new?language=perl">paiza.IO</a></em> ;</li>
<li>
<em><a href="http://www.compileonline.com/execute_perl_online.php">codingground</a></em> ;</li>
<li>
<em><a href="https://js.do/perl/">JS.do</a></em>.</li>
</ul>
<h2 id="toc-développer-avec-perl">Développer avec Perl</h2>
<h3 id="toc-installer-des-modules-du-cpan">Installer des modules du CPAN</h3>
<p>La <strong>méthode moderne</strong> consiste à utiliser <a href="https://metacpan.org/pod/distribution/App-cpanminus/bin/cpanm">cpanm</a> (cpanminus). L’outil se charge d’aller chercher le module demandé et de résoudre les dépendances. Par exemple, pour installer l’excellent module <a href="https://metacpan.org/pod/XML::LibXML">XML::LibXML</a> de <strong>Shlomif</strong> qui est la bibliothèque de liaison Perl de <a href="http://www.xmlsoft.org/">libxml2</a>, on peut faire <code>sudo cpanm XML::LibXML</code>, qui produit la sortie suivante (tronquée) :</p>
<pre><code class="bash">--> Working on XML::LibXML
Fetching http://www.cpan.org/authors/id/S/SH/SHLOMIF/XML-LibXML-2.0201.tar.gz ... <span class="nv">OK</span>
<span class="o">==</span>> Found dependencies: Alien::Libxml2
--> Working on Alien::Libxml2
Fetching http://www.cpan.org/authors/id/P/PL/PLICEASE/Alien-Libxml2-0.09.tar.gz ... OK
<span class="o">[</span>...<span class="o">]</span>
Building and testing Alien-Libxml2-0.09 ... OK
Successfully installed Alien-Libxml2-0.09
Configuring XML-LibXML-2.0201 ... OK
Building and testing XML-LibXML-2.0201 ... OK
Successfully installed XML-LibXML-2.0201 <span class="o">(</span>upgraded from <span class="m">2</span>.0128<span class="o">)</span>
<span class="m">13</span> distributions installed</code></pre>
<p>Réinstaller un ensemble de modules Perl CPAN peut se faire simplement en réexécutant une série de commandes <strong>cpanm</strong> ou bien en spécifiant des dépendances dans un fichier <a href="https://metacpan.org/pod/cpanfile">cpanfile</a> (et utiliser <a href="https://metacpan.org/pod/Carton">carton</a> pour la configuration).</p>
<h3 id="toc-les-linters">Les linters</h3>
<p>Exécutables à la main ou intégrables dans vos scripts, IDE ou éditeurs (utilisateurs de vim : <a href="https://github.com/w0rp/ale/">ale</a> ou <a href="https://github.com/vim-syntastic/syntastic">syntastic</a>).</p>
<ul>
<li>
<a href="https://perldoc.perl.org/perlrun.html"><code>perl -c</code></a>, pour vérifier la syntaxe. Attention ça fait plus que simplement vérifier la syntaxe, ça exécute aussi ce qui est dans les blocs <code>BEGIN</code> et <code>END</code> qui sont destinés à être exécutés pendant la compilation. Ce <em>design</em> est <a href="https://github.com/w0rp/ale/issues/1186">la raison pour laquelle</a> le <em>linter</em> par défaut utilisé par le greffon <a href="https://github.com/w0rp/ale">vim ale</a> n’est plus <code>perl -c</code> (ni même <code>perl -w</code>).
La vérification de syntaxe est top. Personnellement, j’ai un projet qui contient ça dans le script de tests unitaires avec des vrais tests après :</li>
</ul>
<pre><code class="perl"><span class="k">my</span> <span class="nv">@files</span> <span class="o">=</span> <span class="sr"><./*.pl></span><span class="p">;</span>
<span class="nb">push</span> <span class="nv">@files</span><span class="p">,</span> <span class="sr"><./*.pm></span><span class="p">;</span>
<span class="k">for</span> <span class="k">my</span> <span class="nv">$f</span> <span class="p">(</span><span class="nv">@files</span><span class="p">)</span> <span class="p">{</span>
<span class="nb">system</span><span class="p">(</span><span class="s">"perl -c $f 2>/dev/null"</span><span class="p">);</span>
<span class="k">my</span> <span class="nv">$real_ret_value</span> <span class="o">=</span> <span class="vg">$?</span> <span class="o">>></span> <span class="mi">8</span><span class="p">;</span>
<span class="k">if</span><span class="p">(</span><span class="nv">$real_ret_value</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="k">print</span> <span class="s">"$f : Syntax error !\n"</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="k">print</span> <span class="s">"$f : OK\n"</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">ok</span><span class="p">(</span><span class="nv">$real_ret_value</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="ow">or</span> <span class="nv">$fails</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span></code></pre>
<p>C’est quand même la base d’avoir du code syntaxiquement juste. :)</p>
<ul>
<li>
<a href="https://metacpan.org/pod/Perl::Critic">Perl::Critic</a>, qui <em>critique</em> votre style de codage mais ne fait pas de vérification de syntaxe. Par exemple, le fichier <code>bad.pl</code> contien :</li>
</ul>
<pre><code class="perl"><span class="k">use</span> <span class="nn">strict</span><span class="p">;</span>
<span class="k">print</span> <span class="s">"toto"</span> <span class="p">}{</span></code></pre>
<p>Et <code>perl -c bad.pl</code> nous affiche bien :</p>
<pre><code>Unmatched right curly bracket at bad.pl line 3, at end of line
syntax error at bad.pl line 3, near ""toto" }"
Missing right curly or square bracket at bad.pl line 3, at end of line
bad.pl had compilation errors.
</code></pre>
<p>Mais <code>perlcritic bad.pl</code> nous dit que tout va bien <code>bad.pl source OK</code> (mais il râle si on ne met pas le <code>use strict</code>).</p>
<ul>
<li>Un module qui était dans le cœur de Perl mais qui est sorti du <em>core</em> en <strong>5.19</strong> : <a href="https://metacpan.org/pod/B::Lint">B::Lint</a>.
Au passage comment fait‐on pour retrouver l’historique d’un module ? Utilisez <strong>corelist</strong> ! <code>corelist B::Lint</code> qui nous donne : </li>
</ul>
<pre><code>Data for 2017-09-22
B::Lint was first released with perl 5.005, deprecated (will be CPAN-only) in v5.17.9 and removed from v5.19.0
</code></pre>
<p>Toujours disponible dans CPAN évidemment. :)</p>
<ul>
<li>Et encore un <a href="https://metacpan.org/pod/Perl::Lint">Perl::Lint</a> qui se concentre sur la vitesse tout en étant compatible avec <strong>Perl::Critic</strong>.</li>
</ul>
<h3 id="toc-comment-compiler-perl">Comment compiler perl</h3>
<p><a href="https://www.cpan.org/src/">Instructions pour compiler perl</a>. En fait, ça va donner ça :</p>
<pre><code class="bash">wget https://www.cpan.org/src/5.0/perl-5.30.0.tar.gz
tar -xzf perl-5.30.0.tar.gz
<span class="nb">cd</span> perl-5.30.0
./Configure -des -Dprefix<span class="o">=</span><span class="nv">$HOME</span>/localperl
make
make <span class="nb">test</span>
make install</code></pre>
<p><a href="https://perldoc.perl.org/perlport.html#PLATFORMS">Portabilité de perl : (plus de cent plates‐formes)</a></p>
<h3 id="toc-compiler-les-modules">Compiler les modules</h3>
<p>Qu’on utilise ou non un installeur de modules comme <a href="https://metacpan.org/pod/distribution/App-cpanminus/bin/cpanm">cpanm</a>, au bout du compte le module est compilé avec <a href="https://metacpan.org/pod/ExtUtils::MakeMaker">ExtUtils::MakeMaker</a> ou <a href="https://metacpan.org/pod/Module::Build">Module::Build</a>. <a href="https://metacpan.org/pod/ExtUtils::MakeMaker">ExtUtils::MakeMaker</a> est toujours un module du <em>core</em>, alors que <a href="https://metacpan.org/pod/Module::Build">Module::Build</a> a été ajouté puis enlevé (<strong>5.9 → 5.19</strong>). David Golden explique dans un billet de blog pourquoi <a href="https://xdg.me/blog/paying-respect-to-modulebuild/">il a demandé à retirer Module::Build</a>.</p>
<h4 id="toc-extutilsmakemaker">ExtUtils::MakeMaker</h4>
<p>Le module <a href="https://metacpan.org/pod/ExtUtils::MakeMaker">ExtUtils::MakeMaker</a> génère un <strong>makefile</strong> à partir d’un fichier <code>Makefile.PL</code> :</p>
<pre><code class="bash">perl Makefile.PL
make
make install</code></pre>
<h4 id="toc-modulebuild">Module::Build</h4>
<p>Le module <a href="https://metacpan.org/pod/Module::Build">Module::Build</a> sert à la même chose mais génère un fichier <strong>Build</strong> à partir d’un fichier <code>BUILD.PL</code> :</p>
<pre><code>perl Build.PL
./Build
./Build test
./Build install
</code></pre>
</div><div><a href="https://linuxfr.org/news/pour-tout-savoir-du-perl-post-moderne.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/117650/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/pour-tout-savoir-du-perl-post-moderne#comments">ouvrir dans le navigateur</a>
</p>
contra-shYsabeau 🧶 🧦Davy DefaudZeroHeurehttps://linuxfr.org/nodes/117650/comments.atom