O release 10 do Perl 5 trouxe muitas novidades para desenvolvedores. Conheça um pouco mais sobre smart matching, given-when, o operador // e tantas outras coisas bacanas!
(apresentado no Encontro Técnico dos Rio Perl Mongers em 2008)
Novidades do Perl
5.10
Breno G. de Oliveira
breno@rio.pm.org
[ descaradamente roubado/adaptado das palestras de
Ricardo Signes, Paul Fenwick, Audrey Tang e Leon Brocard
e do perl5100delta.pod do Rafaël Garcia-Suarez ]
Perl 5.10
● Nova versão do Perl! Yay!
● Mais rápido!
● Mais bonito!
● Mais eficiente!
● Novas features!
Perl 5.10
● Muitas novidades!
● Muitas otimizações internas
● Muitas “pequenas grandes coisas”
(especialmente em expressões regulares!)
● Vamos apenas arranhar a superfície
● perldoc perl5100delta
say – o print dos seus sonhos!
● Lembra quando você escrevia assim?
print “alo, mundo!n”;
print “$_n” foreach (@item)
● Agora, escreva assim!
say “alo, mundo!”;
say foreach (@item);
// – É um pássaro?! É uma ER?! Não!
● Lembra quando você escrevia assim?
$valor = defined $valor
? $valor
: pega_valor();
● E tentava escrever assim? (e quase conseguia)
$valor = $valor || pega_valor();
// – É um pássaro?! É uma ER?! Não!
● Lembra quando você escrevia assim?
$valor = defined $valor
? $valor
: pega_valor();
● Experimente assim!
$valor = $valor // pega_valor();
state – Variáveis “estáticas”
● Lembra quando você escrevia assim?
{
my $i = 0;
sub incrementa {
return $i++;
}
}
state – Variáveis “estáticas”
● Agora, escreva assim!
sub incrementa {
state $i = 0;
return $i++;
}
-X – testes de arquivos empilhados
● Lembra quando você escrevia assim?
if (f $filename and w _ and z _)
unlink $filename;
}
● Agora, escreva assim!
if (f w z $filename)
unlink $filename;
}
matches nominais!
● Lembra quando você escrevia assim?
if (m/
(w{3} ) # item
(d{2,}) # valor
(w* ) # extra
/x
) {
$item = $1;
$valor = $2;
$extra = $3;
}
~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100
~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100
100.00
~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100
100.00
1e2
~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100
100.00
1e2
“100”
~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100
100.00
1e2
“100”
“100.000000”
~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100 “+100”
100.00
1e2
“100”
“100.000000”
~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100 “+100”
100.00 “-100”
1e2
“100”
“100.000000”
~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100 “+100”
100.00 “-100”
1e2 “ 100 ”
“100”
“100.000000”
~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100 “+100”
100.00 “-100”
1e2 “ 100 ”
“100” 1000
“100.000000”
~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100 “+100”
100.00 “-100”
1e2 “ 100 ”
“100” 1000
“100.000000” “vale 100”
~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100 “+100”
100.00 “-100”
1e2 “ 100 ”
“100” 1000
“100.000000” “vale 100”
~~ um match “inteligente”
● Comparação DWIM
my @herois = qw(jaspion jiraya jiban);
say “uhu!” if @herois ~~ jiraya ;
say “uhu!” if @herois ~~ 'jiraya';
say “uhu!” if @herois ~~ “jiraya”;
say “uhu!” if @herois ~~ /jiraya/;
~~ um match “inteligente”
● E a ordem não importa!
my @herois = qw(jaspion jiraya jiban);
say “uhu!” if jiraya ~~ @herois;
say “uhu!” if 'jiraya' ~~ @herois;
say “uhu!” if “jiraya” ~~ @herois;
say “uhu!” if /jiraya/ ~~ @herois;
switch – comparando eventos
● Agora, escreva assim!
given ($a) {
when (1) { ... }
when (2) { ... }
when (7) { ... }
when (13) { ... }
when (/D/) { ... }
when ($_ > 300) { ... }
when ($_ < 50) { ... }
default { ... }
}
FieldHashes – Inside-out nativo!
● Lembra quando você escrevia assim?
{
my %name_of = ();
sub new { ... }
...
sub CLONE { ... }
sub DESTROY { ... }
}
FieldHashes – Inside-out nativo!
● Agora, escreva assim!
use Hash::Util::FieldHash qw(fieldhash)
{
fieldhash my %name_of = ();
sub new { ... }
...
}
● Ou use Class::Std, ou Object::InsideOut
● ou Moose :-)
UNIVERSAL::DOES
● Agora você não depende mais de herança
para saber se um determinado papel é
desempenhado pela classe!
package Aviao;
sub DOES {
my ($self, $role) = @_;
return 1 if $role eq 'voar';
return $self>SUPER::DOES($role);
}
if($coisa>DOES ('voar') {
say “importa se sou avião ou passarinho?”;
}
Ih, não funciona!!!
As novas features da versão 5.10 são “opt-in”
use feature qw( say switch );
use feature ':5.10';
use 5.10.0;
Literalmente :-)
Migre “djá”!
● Mas atenção! Há (raras) incompatibilidades:
➔ Variáveis especiais @+ e @- não são mais
interpoladas em ERs
➔ pequenos ajustes nos templates de
pack/unpack para sanar inconsistências
➔ $* e $# e construção (?p{}) foram removidas
➔ Muitas opções de tainting e segurança
adicionadas/ajustadas
Novidades do Perl 5.10
Obrigado!
Dúvidas?
Breno G. de Oliveira
breno@rio.pm.org