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é

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

Field hashes

Field hashes

Optimisations

Optimisations

Optimisations

Optimisations

Optimisations

Optimisations

Optimisations

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

Conclusion

Conclusion

Conclusion