Les nouveautés de Perl 5.18

Sébastien Aperghis-Tramoni, sebastien@aperghis.net

Cycles de publication

  • plannification des versions

    • une version majeure par an (Q2)

    • des versions mineures tous les 2-3 mois

  • cycle de dépréciation court

    • avertissement pendant une ou deux versions majeures

    • suppression effective à la version majeure suivante

    • modules retirés envoyés sur le CPAN

Perl 5.12

  • 5.12.0 le 12 avril 2010

  • 5.12.1 le 16 mai 2010

  • 5.12.2 le 6 septembre 2010

  • 5.12.3 le 21 janvier 2011

  • 5.12.4 le 20 juin 2011

Perl 5.14

  • 5.14.0 le 14 mai 2011

  • 5.14.1 le 17 juin 2011

  • 5.14.2 le 26 septembre 2011

Perl 5.16

  • 5.16.0 le 12 mai 2012

    • 5.12 n'est plus officiellement supportée

  • 5.16.1 le 8 août 2012

  • 5.16.2 le 1er novembre 2012

Perl 5.18

  • 5.18.0 le 18 mai 2013

Refonte des hashes

  • important changement d'implémentation

  • la graine pour la fonction de calcul est maintenant aléatoire, pour chaque hash

  • ordre des clés et valeurs est variable

  •  %hash = ( ... );
     %copy = %hash;
     # keys %hash différent de keys %copy

Refonte des hashes

  • raison : protection contre les attaques par complexité algorithmique

  • variables d'environnement PERL_PERTURB_KEYS, PERL_HASH_SEED, PERL_HASH_SEED_DEBUG

  • support de plusieurs fonctions de hash :

    • One_At_A_Time (old, normal, hard), SipHash

    • DJB2, MurmurHash v3, SDBM, SuperFast

Refonte des hashes

  • conseils :

    • ne jamais s'appuyer sur l'ordre des clés renvoyés par keys

    • ne pas exposer cet ordre à l'extérieur du programme

    • toujours trier avec sort ou SortKeys (Data::Dumper)

Nouvelles fonctionnalités

  • fonctions lexicales (experimental)

  •  use feature "lexical_subs";
    
     state sub myfunc { ... }  # fonction privée, créée une seule fois
        my sub myfunc { ... }  # fonction privée, crééer à chaque fois
       our sub myfunc { ... }  # alias lexical d'une fonction globale
  • avertissements sur les fonctionnalités expérimentales

  •  no warnings "experimental::lexical_subs";
     use feature "lexical_subs";
  • ~~ et my $_ sont devenues des fonctionnalités expérimentales

Nouvelles fonctionnalités

  • plus de mots clés dans CORE::

  • kill supporte des noms de signaux negatifs : KILL -HUP -$$

  • next, last et redo supportent les étiquettes calculées

  • given fait un alias sur le $_ global, comme foreach

Nouvelles fonctionnalités

  • ${^LAST_FH} contient le dernier descripteur de fichier utilisé

  • readline() avec $/ = \N lit maintenant N caractères, au lieu de N octets

Syntaxe

  • qw(..) ne peut plus être utilisé comme parenthèses

    •  for my $pony qw< Twilight Fluttershy Pinkie_Pie > { ... }  # WRONG
    •  for my $pony (qw< Twilight Fluttershy Pinkie_Pie >) { ... }
  • analyse plus stricte de s///e

Expressions régulières

  • $&, $` et $' n'impactent plus les performances

  • la tabulation verticale (\v) fait maintenant partie de \s

  • /(?{})/ et /(??{})/ ont été fortement retravaillées

Expressions régulières

  • les accolades littérales non protégées ({) sont interdites

    • doivent être soit protégées, soit partie d'une construction

    • permet de repérer des erreurs comme /\w{,5}/

    • réservé pour de futures extensions

Expressions régulières

  • opérations d'ensembles de classes (?[ ])

  • experimental, catégorie egex_sets

  • permet de combiner des classes avec & (intersection), + ou | (union), - (soustraction), ^ (différence symétrique)

  •  # cherche des caractères alphabétiques, sans les chiffres
     /(?[ \w - \d ])/
  •  # cherche tous les chiffres dans les scripts thaïlandais ou laotien
     /(?[ ( \p{Thai} + \p{Lao} ) & \p{Digit} ])/

Unicode

  • Unicode 6.2

  • \N{BELL} désigne maintenant U+1F514 au lieu de U+0007 (BEL)

  • divergence sur la correspondance en insensibilité à la casse

    •  "ss" =~ /ß/i;  # correspond
    • Unicode 6.2 revient en arrière

    • en Perl, continue de correspondre si spécifié explicitement (/ß/), mais pas implicitement (/[\0-\xff]/)

Unicode

  • \N{..} avec un nom inconnu ou auparavant rendu obsolète est maintenant une erreur

  • support des caractères Unicode pour les noms d'alias :

  •     use v5.18;
        use utf8;
    
        use charnames ":alias" => {
            "dièse"       => "0x23",
            "esperluette" => "0x26",
        };
    
        say "\N{esperluette}\N{dièse}x1F4A9;"

Autres changements

  • study est maintenant une fonction vide

  • require meurt sur les fichiers non lisibles

  • do positionne toujours $@ (comme eval)

  • do function utilise maintenant comme nom de fichier ce que function renvoie

  • les valeurs stockées dans %ENV sont forcées en octets

  • plusieurs correctifs sur les formats

Optimisations

  • nouveau mécanisme de copy-on-write

  • les motifs de recherche avec des propriétés Unicode sont plus rapides

  • pack avec des arguments constants est maintenant réduit (si possible)

  • .. x .. est maintenant réduit à la compilation quand c'est possible

Dépréciations

  • syntaxe

    • $_ lexical (trop confus, trop complexe)

  • modules

    • encoding, Thread.pm, Filter::Simple, B::Lint, PerlIO::mmap, File::CheckTree, Pod::LaTeX, Pod::Parser, Text::Soundex

    • CPANPLUS et ses dépendances, Archive::Extract, Log::Message, Module::Pluggable, Object::Accessor, Params::Check, Term::UI

Arrêt de support

  • plates-formes

    • BeOS, EPOC, MPE/iX, UTS Global, VM/ESA, Rhapsody

Futur arrêt de support

  • plates-formes

    • DG/UX, NeXT, AmigaOS, DJGPP, NetWare, OS/2, Plan 9

Questions ?

Merci