O documento resume as principais novidades da versão 5.10 do Perl, incluindo novas funcionalidades como say, //, state e switch, além de melhorias em expressões regulares e matches nominais. Menciona também que as novas features precisam ser habilitadas via use feature ou use 5.10.0.
2. 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 ]
3. Perl 5.10
● Nova versão do Perl! Yay!
● Mais rápido!
● Mais bonito!
● Mais eficiente!
● Novas features!
4. 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
5. 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);
6. // – É 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();
7. // – É um pássaro?! É uma ER?! Não!
● Lembra quando você escrevia assim?
$valor = defined $valor
? $valor
: pega_valor();
● Experimente assim!
$valor = $valor // pega_valor();
8. state – Variáveis “estáticas”
● Lembra quando você escrevia assim?
{
my $i = 0;
sub incrementa {
return $i++;
}
}
9. state – Variáveis “estáticas”
● Agora, escreva assim!
sub incrementa {
state $i = 0;
return $i++;
}
10. -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;
}
11. matches nominais!
● Lembra quando você escrevia assim?
if (m/
(w{3} ) # item
(d{2,}) # valor
(w* ) # extra
/x
) {
$item = $1;
$valor = $2;
$extra = $3;
}
13. ~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100
14. ~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100
100.00
15. ~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100
100.00
1e2
16. ~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100
100.00
1e2
“100”
17. ~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100
100.00
1e2
“100”
“100.000000”
18. ~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100 “+100”
100.00
1e2
“100”
“100.000000”
19. ~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100 “+100”
100.00 “-100”
1e2
“100”
“100.000000”
20. ~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100 “+100”
100.00 “-100”
1e2 “ 100 ”
“100”
“100.000000”
21. ~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100 “+100”
100.00 “-100”
1e2 “ 100 ”
“100” 1000
“100.000000”
22. ~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100 “+100”
100.00 “-100”
1e2 “ 100 ”
“100” 1000
“100.000000” “vale 100”
23. ~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100 “+100”
100.00 “-100”
1e2 “ 100 ”
“100” 1000
“100.000000” “vale 100”
24. ~~ 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/;
25. ~~ 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;
27. switch – comparando eventos
● Agora, escreva assim!
given ($a) {
when (1) { ... }
when (2) { ... }
when (7) { ... }
when (13) { ... }
when (/D/) { ... }
when ($_ > 300) { ... }
when ($_ < 50) { ... }
default { ... }
}
28. FieldHashes – Inside-out nativo!
● Lembra quando você escrevia assim?
{
my %name_of = ();
sub new { ... }
...
sub CLONE { ... }
sub DESTROY { ... }
}
29. 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 :-)
30. 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?”;
}
31. 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 :-)
33. 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
34. Novidades do Perl 5.10
Obrigado!
Dúvidas?
Breno G. de Oliveira
breno@rio.pm.org