Upload
garux
View
618
Download
0
Embed Size (px)
DESCRIPTION
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)
Citation preview
Novidades do Perl
5.10Breno G. de [email protected]
Novidades do Perl
5.10Breno G. de [email protected]
descaradamente roubado/adaptado das palestras deRicardo 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; }
matches nominais!
● Agora, escreva assim!
if (m/ (?<item> \w{3} ) (?<valor> \d{2,}) (?<extra> \w* ) /x ) { $item = $+{item }; $valor = $+{valor}; $extra = $+{extra}; }
~~ 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.00 1e2 “100” “100.000000”
“+100”
~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100 100.00 1e2 “100” “100.000000”
“+100” “-100”
~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100 100.00 1e2 “100” “100.000000”
“+100” “-100” “ 100 ”
~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100 100.00 1e2 “100” “100.000000”
“+100” “-100” “ 100 ” 1000
~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100 100.00 1e2 “100” “100.000000”
“+100” “-100” “ 100 ” 1000 “vale 100”
~~ um match “inteligente”
● Comparação DWIM
say “uhu!” if $a ~~ 100;
100 100.00 1e2 “100” “100.000000”
“+100” “-100” “ 100 ” 1000 “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
● Lembra quando você escrevia assim?
if ($a == 1) { ... } elsif ($a == 2) { ... } elsif ($a == 7) { ... } elsif ($a == 13) { ... } elsif ($a =~ m/\D/) { ... } elsif ($a > 300) { ... } elsif ($a < 50) { ... } else { ... }
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çapara 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 :-)
Ih, não funciona!!!
$ perl e 'say "alo, mundo"'String found where operator expected at e line 1, near "say "alo, mundo"" (Do you need to predeclare say?)syntax error at e line 1, near "say "hello""
$ perl E 'say "alo, mundo"'alo, mundo$
Migre “djá”!
● Mas atenção! Há (raras) incompatibilidades:
➔Variáveis especiais @+ e @- não são maisinterpoladas 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çaadicionadas/ajustadas