SlideShare a Scribd company logo
1 of 34
Download to read offline
Novidades do Perl
     5.10
     Breno G. de Oliveira
      breno@rio.pm.org
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;
      }
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”
        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
●   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ç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 :-)
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 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

More Related Content

More from garux

Introdução ao Perl 6
Introdução ao Perl 6Introdução ao Perl 6
Introdução ao Perl 6garux
 
Descobrindo a linguagem Perl
Descobrindo a linguagem PerlDescobrindo a linguagem Perl
Descobrindo a linguagem Perlgarux
 
Communities - Perl edition (RioJS)
Communities - Perl edition (RioJS)Communities - Perl edition (RioJS)
Communities - Perl edition (RioJS)garux
 
Seja um Perl Core Hacker - é (muito) mais fácil do que você pensa
Seja um Perl Core Hacker - é (muito) mais fácil do que você pensaSeja um Perl Core Hacker - é (muito) mais fácil do que você pensa
Seja um Perl Core Hacker - é (muito) mais fácil do que você pensagarux
 
Game Development with SDL and Perl
Game Development with SDL and PerlGame Development with SDL and Perl
Game Development with SDL and Perlgarux
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5garux
 
Perl Moderno, dia4
Perl Moderno, dia4Perl Moderno, dia4
Perl Moderno, dia4garux
 
Perl Moderno, dia3
Perl Moderno, dia3Perl Moderno, dia3
Perl Moderno, dia3garux
 
Perl Moderno, dia2
Perl Moderno, dia2Perl Moderno, dia2
Perl Moderno, dia2garux
 
Perl Moderno, dia1
Perl Moderno, dia1Perl Moderno, dia1
Perl Moderno, dia1garux
 
Orientação a Objetos Elegante e Eficiente: Brevíssima Introdução ao Moose
Orientação a Objetos Elegante e Eficiente: Brevíssima Introdução ao MooseOrientação a Objetos Elegante e Eficiente: Brevíssima Introdução ao Moose
Orientação a Objetos Elegante e Eficiente: Brevíssima Introdução ao Moosegarux
 
Perl Quiz 2009 (YAPC::BR)
Perl Quiz 2009 (YAPC::BR)Perl Quiz 2009 (YAPC::BR)
Perl Quiz 2009 (YAPC::BR)garux
 
Jogos em Perl
Jogos em PerlJogos em Perl
Jogos em Perlgarux
 
Logging e depuração enterprise-level com Log4perl
Logging e depuração enterprise-level com Log4perlLogging e depuração enterprise-level com Log4perl
Logging e depuração enterprise-level com Log4perlgarux
 
Desenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de ComandoDesenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de Comandogarux
 

More from garux (15)

Introdução ao Perl 6
Introdução ao Perl 6Introdução ao Perl 6
Introdução ao Perl 6
 
Descobrindo a linguagem Perl
Descobrindo a linguagem PerlDescobrindo a linguagem Perl
Descobrindo a linguagem Perl
 
Communities - Perl edition (RioJS)
Communities - Perl edition (RioJS)Communities - Perl edition (RioJS)
Communities - Perl edition (RioJS)
 
Seja um Perl Core Hacker - é (muito) mais fácil do que você pensa
Seja um Perl Core Hacker - é (muito) mais fácil do que você pensaSeja um Perl Core Hacker - é (muito) mais fácil do que você pensa
Seja um Perl Core Hacker - é (muito) mais fácil do que você pensa
 
Game Development with SDL and Perl
Game Development with SDL and PerlGame Development with SDL and Perl
Game Development with SDL and Perl
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5
 
Perl Moderno, dia4
Perl Moderno, dia4Perl Moderno, dia4
Perl Moderno, dia4
 
Perl Moderno, dia3
Perl Moderno, dia3Perl Moderno, dia3
Perl Moderno, dia3
 
Perl Moderno, dia2
Perl Moderno, dia2Perl Moderno, dia2
Perl Moderno, dia2
 
Perl Moderno, dia1
Perl Moderno, dia1Perl Moderno, dia1
Perl Moderno, dia1
 
Orientação a Objetos Elegante e Eficiente: Brevíssima Introdução ao Moose
Orientação a Objetos Elegante e Eficiente: Brevíssima Introdução ao MooseOrientação a Objetos Elegante e Eficiente: Brevíssima Introdução ao Moose
Orientação a Objetos Elegante e Eficiente: Brevíssima Introdução ao Moose
 
Perl Quiz 2009 (YAPC::BR)
Perl Quiz 2009 (YAPC::BR)Perl Quiz 2009 (YAPC::BR)
Perl Quiz 2009 (YAPC::BR)
 
Jogos em Perl
Jogos em PerlJogos em Perl
Jogos em Perl
 
Logging e depuração enterprise-level com Log4perl
Logging e depuração enterprise-level com Log4perlLogging e depuração enterprise-level com Log4perl
Logging e depuração enterprise-level com Log4perl
 
Desenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de ComandoDesenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de Comando
 

Novidades do Perl 5.10 em

  • 1. Novidades do Perl 5.10 Breno G. de Oliveira breno@rio.pm.org
  • 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;       }
  • 12. matches nominais! ● Agora, escreva assim!       if (m/             (?<item>  w{3} )             (?<valor> d{2,})             (?<extra> w*   )            /x         ) {             $item  = $+{item };             $valor = $+{valor};             $extra = $+{extra};       }
  • 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;
  • 26. 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                {  ...  }
  • 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