Un panorama de Perl 5.10
Plein de nouveautés
Quoi de neuf?
Plein de nouveautés
Bon
Plein de nouveautés
Alors
Defined Or
Standard Or
$a || $b
<=>
$a ? $a : $b
Defined Or
Defined Or
$a // $b
<=>
defined $a ? $a : $b
Defined Or
Defined Or
$a // $b
<=>
defined $a ? $a : $b
Plus concis
Plus rapide
Defined Or
Defined Or
$a // $b
<=>
defined $a ? $a : $b
Plus concis
Plus rapide
$a //= $b
Defined Or
Defined Or
$a // $b
<=>
defined $a ? $a : $b
Plus concis
Plus rapide
$a //= $b
Déjà standard sous FreeBSD
say
say(...) est une forme abrégée de
print ..., "\n";
Switch
given ...
when ... [
default ... ]
given ($foo) {
when (/^abc/) { $abc = 1; }
when (/^def/) { $def = 1; }
when (/^xyz/) { $xyz = 1; }
default { $nothing = 1; }
}
Switch
given ...
when ... [
default ... ]
given ($foo) {
when (/^abc/) { $abc = 1; }
when (/^def/) { $def = 1; }
when (/^xyz/) { $xyz = 1; }
default { $nothing = 1; }
}
Bien plus flexible que le switch C (et apparentés)
Switch
Comment ça marche?
given (EXPR) fait un alias de $_ vers EXPR
Switch
Comment ça marche?
given (EXPR) fait un alias de $_ vers EXPR
$ perl -E 'given ("hello") {say "$_ world"}'
hello world
Switch
when(BOOL_EXPR) évalue l'expression booléenne. Par exemple:
when ($_ gt "ab") { ... }
when (/^\d+$/ and $_ < 10) { ... }
Switch
Dans les autres cas,
when(EXPR) fait un
smart match de $_ avec EXPR.
C'est équivalent à:
when ($_ ~~ EXPR) { ... }
Smart Match
Nouvel opérateur
~~
Fait ce que vous voulez (FCQQVV) (tm) avec à peu près n'importe quoi.
Smart Match
given ($foo) {
...
when (undef) {
say q($foo n'est pas défini);
}
...
}
Smart Match
given ($foo) {
...
when ([1,3,5,7,9]) {
say 'Vous avez commis un impair';
}
...
}
Smart Match
given ($foo) {
...
when (@array) {
say '$foo est dans @array';
}
...
}
Smart Match
given ($foo) {
...
when (%hash) {
say '$foo est une clé de %hash';
}
...
}
Smart Match
given ($foo) {
...
when (\&complicated_check) {
say 'complicated_check($foo) est content';
}
...
}
Variables d'état
Gardent leur valeur entre deux appels de fonction.
sub foo {
state $x = 2;
++$x;
}
say foo() for 1..3;
donne:
3
4
5
use feature
Les nouveaux mots-clés peuvent poser des problèmes de compatibilité.
use feature 'say';
use feature 'state';
use feature 'switch'; # given, when, default
use feature
Les nouveaux mots-clés peuvent poser des problèmes de compatibilité.
use feature ':5.10';
use feature
Les nouveaux mots-clés peuvent poser des problèmes de compatibilité.
use 5.010;
use feature
Les nouveaux mots-clés peuvent poser des problèmes de compatibilité.
perl -E 'say "hello"'
$_ lexical
Plus d'effets de bord
sub badfunc {
while(<IN>) { ... }
}
{
my $_;
...
badfunc();
}
$_ lexical
Plus d'effets de bord
sub goodfunc {
my $_; # meilleur que "local $_"
while(<IN>) { ... }
}
$_ lexical
Plus d'effets de bord
sub goodfunc {
my $_; # meilleur que "local $_"
while(<IN>) { ... }
{
our $_;
... # le $_ global est accessible ici
}
}
Prototype (_)
Comme ($), mais vaut $_ par défaut
sub foo (_) { say "hello @_" }
foo("world");
$_ = "boys"; foo();
{ my $_ = "girls"; foo(); }
Prototype (_)
Comme ($), mais vaut $_ par défaut
sub foo (_) { say "hello @_" }
foo("world");
$_ = "boys"; foo();
{ my $_ = "girls"; foo(); }
Permet de simuler des mots-clés, même en présence d'un $_ lexical
UNITCHECK
Exécutés juste après la compilation d'un fichier
package Foo;
UNITCHECK { warn "Foo vient d'être chargé" }
UNITCHECK
Exécutés juste après la compilation d'un fichier
package Foo;
UNITCHECK { warn "Foo vient d'être chargé" }
Plus utiles que les blocs
CHECK (executés après la compilation du programme principal).
Plus de pseudo-hashes
Pouah, sale.
my $pseudohash = [
{ a => 1, b=> 2 },s
"foo",
"bar",
];
print $pseudohash->{a};
En 5.8.x, donne "foo".
Plus de pseudo-hashes

Pouah, sale.
my $pseudohash = [
{ a => 1, b=> 2 },s
"foo",
"bar",
];
print $pseudohash->{a};
En 5.10, donne une erreur. Exterminés!
Pragmas lexicales
On peut désormais écrire ses propres pragmas lexicales en Perl.
Pragmas lexicales
On peut désormais écrire ses propres pragmas lexicales en Perl.
Exemple:
encoding::source sur le CPAN.
Pragmas lexicales
On peut désormais écrire ses propres pragmas lexicales en Perl.
Exemple:
encoding::source sur le CPAN.
D'autres pragmas sont maintenant également lexicales.
(
sort,
bignum,
bigint,
bigrat,
less)
Moins d'effets de bord!
Expressions régulières
- Récursivité
- Captures nommées
- Antéréférences relatives
- Quantificateurs possessifs (?+, *+, ++)
- Verbes de contrôle de réessai
- \K
Récursivité
Des parenthèses bien balancées
/ ^
( \(
(?:
(?> [^()]+ ) | (?1)
)*
\) )
$ /x
Captures nommées
/(?<char>.)\k<char>/
and say "'$+{char}' is the first doubled character";
Antéréférences relatives
# Reconnaît 'abab', 'cdcd', etc.
my $qr = qr /(.)(.)\g{-2}\g{-1}/;
# Reconnaît 'ababcdcd'
/$qr$qr/
Quantificateurs possessifs
?+
*+
++
Comme ?, *, +, mais empêchent tout retour en arrière.
Verbes de contrôle de réessai
(*ACCEPT) end matching with success
(*COMMIT) fail if backtracked into
(*FAIL) end matching with failure
(*MARK) mark a matching point
(*SKIP) skip to here or to a mark
(*PRUNE) don't backtrack past this point
(*THEN) (*PRUNE) and try next alternation
\K
Une assertion pour garder (
Keep) ce qui a été matché et de ne pas l'inclure dans
$&.
s/(foo)bar/$1/g;
===
s/foo\Kbar//g;
=>
variable-length lookbehind!
Field hashes
- Nouveau module Hash::Util::FieldHash
Field hashes
- Nouveau module Hash::Util::FieldHash
- Associe des références à des valeurs
Field hashes
- Nouveau module Hash::Util::FieldHash
- Associe des références à des valeurs
- Permet d'implémenter des objets inside-out
Optimisations
- Les structures de données internes prennent moins d'espace
Optimisations
- Les structures de données internes prennent moins d'espace
- Optimisations sur le moteur d'expressions régulières
Optimisations
- Les structures de données internes prennent moins d'espace
- Optimisations sur le moteur d'expressions régulières
- Plusieurs opérations UTF-8 sont plus rapides
Optimisations
- Les structures de données internes prennent moins d'espace
- Optimisations sur le moteur d'expressions régulières
- Plusieurs opérations UTF-8 sont plus rapides
- L'accès par indice constant aux tableaux lexicaux est plus rapide
Optimisations
- Les structures de données internes prennent moins d'espace
- Optimisations sur le moteur d'expressions régulières
- Plusieurs opérations UTF-8 sont plus rapides
- L'accès par indice constant aux tableaux lexicaux est plus rapide
- Les constantes prennent moins de mémoire
Optimisations
- Les structures de données internes prennent moins d'espace
- Optimisations sur le moteur d'expressions régulières
- Plusieurs opérations UTF-8 sont plus rapides
- L'accès par indice constant aux tableaux lexicaux est plus rapide
- Les constantes prennent moins de mémoire
- La création de tableaux et de hashes anonymes est plus rapide
Optimisations
- Les structures de données internes prennent moins d'espace
- Optimisations sur le moteur d'expressions régulières
- Plusieurs opérations UTF-8 sont plus rapides
- L'accès par indice constant aux tableaux lexicaux est plus rapide
- Les constantes prennent moins de mémoire
- La création de tableaux et de hashes anonymes est plus rapide
- ...
De meilleurs messages d'erreur
Avec 5.8.8:
$ perl -we 'my $foo; print $foo'
Use of uninitialized value in print at -e line 1.
De meilleurs messages d'erreur
Avec 5.10:
$ perl -we 'my $foo; print $foo'
Use of uninitialized value $foo in print at -e line 1.
Quand ?
Oui, quand ?
Conclusion
- Mieux adapté aux gros projets
Conclusion
- Mieux adapté aux gros projets
- Mieux adapté aux environnements demandant de la performance
Conclusion
- Mieux adapté aux gros projets
- Mieux adapté aux environnements demandant de la performance
- C'est de la balle
Conclusion
- Mieux adapté aux gros projets
- Mieux adapté aux environnements demandant de la performance
- C'est de la balle
- Des questions?