Perl
Moderno.
Breno G. de Oliveira   garu@cpan.org
Bruno C. Buss          bbuss@cpan.org




                                        Perl Moderno
Dia #4


         Perl Moderno
Revisão


  . Referências
  . Arrays/hashes anônimos
  . Funções (e funções anônimas)
  . Exceções com stack tracing (Carp)
  . @ARGV e Getopt::Long
  . CPAN <3


                              Perl Moderno
Expressões Regulares



                Perl Moderno
http://xkcd.com/208/
                       Perl Moderno
m//

      Perl Moderno
//

     Perl Moderno
m//

      Perl Moderno
m{}

      Perl Moderno
$var =~ m//

         Perl Moderno
$var !~ m//

         Perl Moderno
if ( $var =~ m/UFRJ/ ) {
     say 'Yay!';
}


                     Perl Moderno
if ( $var =~ /UFRJ/ ) {
     say 'Yay!';
}


                      Perl Moderno
if ( $var !~ /UFRJ/ ) {
     say 'humpf.';
}


                      Perl Moderno
if ( $var !~ m/UFRJ/ ) {
     say 'humpf.';
}


                     Perl Moderno
Modificadores



            Perl Moderno
my $frase = 'aluno da UFRJ';


if ( $frase =~ m/UFRJ/i ) {
     say 'Yay!';
}




                          Perl Moderno
my $frase = 'aluno da ufrj';


if ( $frase =~ m/UFRJ/i ) {
     say 'Yay!';
}




                          Perl Moderno
my $frase = 'aluno da uFRj';


if ( $frase =~ m/UFRJ/i ) {
     say 'Yay!';
}




                          Perl Moderno
my $frase = 'UFRJufrjUFRJ';
my $n = 0;
while ( $frase =~ m/UFRJ/g ) {
    $n++;
}
say “UFRJ aparece $n vezes”;


                         Perl Moderno
my $frase = 'UFRJufrjUFRJ';
my $n = 0;
while ( $frase =~ m/UFRJ/ig ) {
    $n++;
}
say “UFRJ aparece $n vezes”;


                         Perl Moderno
Âncoras



          Perl Moderno
my $frase = 'aluno da UFRJ';


if ( $frase =~ m/UFRJ$/ ) {
     say 'Yay!';
}




                          Perl Moderno
my $frase = 'aluno da UFRJ';


if ( $frase =~ m/^UFRJ/ ) {
     say 'Yay!';
}




                         Perl Moderno
my $frase = 'aluno da UFRJ';


if ( $frase =~ m/^UFRJ$/ ) {
    say 'Yay!';
}




                         Perl Moderno
my $frase = 'aluno da UFRJ';


if ( $frase =~ m/bUFRJb/ ) {
     say 'Yay!';
}




                          Perl Moderno
Classes (conjuntos)
   de caracteres



                Perl Moderno
if ( $linguagem =~ m/[pP]erl/ ) {
    say 'Yay!';
}




                           Perl Moderno
if ( $animal =~ m/[rg]ato/ ) {
     say 'Yay!';
}




                           Perl Moderno
if ( $animal =~ m/[^rg]ato/ ) {
     say 'Yay!';
}




                           Perl Moderno
if ( $valor =~ m/[a-z]/ ) {
     say 'existe uma letra!';
}




                              Perl Moderno
if ( $valor =~ m/[a-zA-Z]/ ) {
     say 'existe uma letra!';
}




                            Perl Moderno
if ( $valor =~ m/[a-z]/i ) {
     say 'existe uma letra!';
}




                               Perl Moderno
if ( $valor =~ m/item[0-9]/ ) {
     say 'item encontrado!';
}




                           Perl Moderno
if ( $valor =~ m/itemd/ ) {
     say 'item encontrado!';
}




                               Perl Moderno
d   dígitos
w   caracteres de palavra
s   espaços
.    qualquer coisa (exceto n)




                       Perl Moderno
D   não dígitos
W   não caracteres de palavra
S   não espaços




                      Perl Moderno
sempre que precisar
casar algum meta caractere,
        escape com 

                      Perl Moderno
my $frase = 'cachorros e gatos';


if ( $frase =~ m/gato|cachorro/ ) {
     say 'animal encontrado!';
}




                                      Perl Moderno
my $frase = 'cachorros e gatos';


if ( $frase =~ m/gato[s]|cachorro[s]/ ) {
     say 'animal no plural encontrado!';
}




                                       Perl Moderno
my $frase = 'cachorros e gatos';


if ( $frase =~ m/(gato|cachorro)[s]/ ) {
     say 'animal no plural encontrado!';
}




                                       Perl Moderno
my $frase = 'cachorros e gatos';


if ( $frase =~ m/(gato|cachorro)s/ ) {
     say 'animal no plural encontrado!';
}




                                         Perl Moderno
my $frase = 'cachorros e gatos';


if ( $frase =~ m/(gato|cachorro)s/ ) {
     say $1;
}




                                         Perl Moderno
my $frase = 'cachorros e gatos';


if ( $frase =~ m/(?:gato|cachorro)s/ ) {
     say $1;
}




                                       Perl Moderno
my $frase = 'cachorros e gatos';


if ( $frase =~ m/(?<bicho>gato|cachorro)s/ ) {
    say $+{bicho};
}




                                      Perl Moderno
exercício

  Faça um programa que leia
  uma frase e diga se a sigla
de alguma UFXX foi encontrada
        (e diga qual)



                        Perl Moderno
Quantificadores




              Perl Moderno
a?       'a', 0 ou 1 vezes
a*       'a', 0 ou mais vezes
a+       'a', 1 ou mais vezes
a{n}     'a', exatamente n vezes
a{n,}    'a', n ou mais vezes
a{n,m}   'a', mínimo n, máximo m

                             Perl Moderno
my $frase = 'o gato no mato';


if ( $frase =~ m/(.*)ato/ ) {
     say $1;
}




                                Perl Moderno
my $frase = 'o gato no mato';


if ( $frase =~ m/(.*)ato/ ) {
     say $1;
}


o gato no m
                                Perl Moderno
quantificadores são “gulosos”
 por padrão. Adicione um '?'
  após o quantificador para
   casar o mínimo possível
                      Perl Moderno
guloso

a?       'a', 0 ou 1 vezes
a*       'a', 0 ou mais vezes
a+       'a', 1 ou mais vezes
a{n}     'a', exatamente n vezes
a{n,}    'a', n ou mais vezes
a{n,m}   'a', mínimo n, máximo m

                             Perl Moderno
não guloso

a??      'a', 0 ou 1 vezes
a*?      'a', 0 ou mais vezes
a+?      'a', 1 ou mais vezes
a{n}?    'a', exatamente n vezes
a{n,}?   'a', n ou mais vezes
a{n,m}? 'a', mínimo n, máximo m

                             Perl Moderno
my $frase = 'o gato no mato';


if ( $frase =~ m/(.*)ato/ ) {
     say $1;
}




                                Perl Moderno
my $frase = 'o gato no mato';


if ( $frase =~ m/(.*?)ato/ ) {
     say $1;
}




                                 Perl Moderno
my $frase = 'o gato no mato';


if ( $frase =~ m/(.*?)ato/ ) {
     say $1;
}


og
                                 Perl Moderno
exercício

Faça um programa que leia uma
frase e, se houver uma hora no
 formato “HH:MM”, diga a hora
encontrada e quantos segundos
         ela representa


                        Perl Moderno
m/^[.+].+(UFww)s*:s*(S.+)$/




                               Perl Moderno
m{
     ^          # início da string
     [.+]       # '.' ou '+'
     .+         # um ou mais caracteres
     (UFww)   # sigla da universidade, em $1
     s*:s*    # ':', com 0 ou + espaços
     (S.+)     # nome do curso, em $2
     $          # fim da string
}x




                                     Perl Moderno
m{
     ^                  # início da string
     [.+]               # '.' ou '+'
     .+                 # um ou mais caracteres
     (?<univ> UFww)   # sigla da universidade
     s*:s*            # ':', com 0 ou + espaços
     (?<curso>S.+)     # nome do curso
     $                  # fim da string
}x




                                          Perl Moderno
m//

      Perl Moderno
s///

       Perl Moderno
s{}{}

        Perl Moderno
$var =~ s/abc/def/;



                Perl Moderno
$var =~ s/abc/def/g;



                Perl Moderno
$var =~ s/^(w+)/'$1'/;




                     Perl Moderno
expressões Regulares são extremamente
    poderosas, com backreferences,
 lookahead/behind, reposicionamento,
 e muito mais. Para mais detalhes, veja
     perlrequick, perlretut e perlre

                               Perl Moderno
exercício

  Modifique o programa das
siglas para ler de um arquivo
 e exibir na tela o conteúdo,
      trocando todas as
   ocorrências por “UFRJ”


                        Perl Moderno
Perl Moderno
use Regex::Common



              Perl Moderno
use Regex::Grammars



               Perl Moderno
(revisitando)


    Executando
programas externos


                    Perl Moderno
use Capture::Tiny;



                Perl Moderno
use Capture::Tiny 'capture';

my ($stdout, $stderr) = capture {
     system './outroprog';
};




                               Perl Moderno
Tratamento de
   exceções



            Perl Moderno
say $dividendo / $divisor;




                    Perl Moderno
eval {
   say $dividendo / $divisor;
};




                        Perl Moderno
eval {
     say $dividendo / $divisor;
};
if ($@) {
     say “erro! $@”;
};


                         Perl Moderno
eval “my $var = 42”;




                 Perl Moderno
não faça eval() de strings
a menos que realmente saiba
     o que está fazendo

                       Perl Moderno
use Try::Tiny;


            Perl Moderno
use Try::Tiny;
try {
     $dividendo / $divisor;
};




                              Perl Moderno
use Try::Tiny;
try {
     $dividendo / $divisor;
} catch {
     say “erro! $_”;
};




                              Perl Moderno
use Try::Tiny;
try {
     $dividendo / $divisor;
} catch {
     say “erro! $_”;
} finally {
     $divisor = 1;
};

                              Perl Moderno
Data e Hora



              Perl Moderno
my $time = time;




                   Perl Moderno
my $time = time;


1297345734


                   Perl Moderno
my $time = localtime;




                        Perl Moderno
my $time = localtime;


Thu Feb 10 11:52:34 2011


                        Perl Moderno
my @time = localtime;




                    Perl Moderno
use DateTime;

my $data = DateTime­>new(
        year  => 2011, 
        month => 2, 
        day   => 7, 
);

my $agora = DateTime­>now;
my $duracao = $agora ­ $data;
say $duracao­>days;

                            Perl Moderno
Arquivos
e Diretórios



               Perl Moderno
use Path::Class;

my $dir     = dir('meu','dir');
my $arquivo = file('dir','arq.txt');

say ”$arquivo”;
say $arquivo­>dir;
my $fh = $arquivo­>open('r') or die $!;

my @linhas = $arquivo­>slurp(chomp => 1);

my $outro_dir = $dir­>parent­>parent;


                                Perl Moderno
use File::HomeDir para encontrar
      o “home” do usuário, e
   File::ShareDir para diretórios
de dados estáticos de sua aplicação
                           Perl Moderno
Arquivos de
Configuração



               Perl Moderno
use Config::Any;

my $config = Config::Any­>load_files(
    { files => ['1.conf', '2.json'] }
);




                              Perl Moderno
Logging



          Perl Moderno
logging “tradicional”




 say  “Aqui.”;




                    Perl Moderno
logging “tradicional”
   debugging




               SURADO
print “FUNCIONA PORRA!!”;
            CEN




                        Perl Moderno
use Log::Log4perl qw(:easy);
Log::Log4perl­>easy_init( $INFO );




  DEBUG “Isso nao é exibido”;

  INFO “Mas isso é o/”;

  ERROR “E isso também!”;



                                Perl Moderno
além do “modo simples”, o
Log::Log4perl possui muitas
 configurações poderosas.

                       Perl Moderno
Criando Módulos


            Perl Moderno
lib/Meu/Modulo.pm




               Perl Moderno
package Meu::Modulo;




                Perl Moderno
package Meu::Modulo;

use 5.12.0;
use warnings;

sub minha_funcao {
  …
}

1;

                       Perl Moderno
package Meu::Modulo;

use 5.12.0;
use warnings;

sub minha_funcao {
  …
}

1;

                       Perl Moderno
usando módulos
 não instalados


             Perl Moderno
use lib 'lib';

use Meu::Modulo;

Meu::Modulo::minha_funcao();




                        Perl Moderno
use FindBin '$Bin';
use lib $Bin . '/lib';

use Meu::Modulo;

Meu::Modulo::minha_funcao();




                         Perl Moderno
Exportando funções




               Perl Moderno
package Meu::Modulo;

use 5.12.0;
use warnings;



sub minha_funcao {
  …
}

1;


                       Perl Moderno
package Meu::Modulo;

use 5.12.0;
use warnings;
use parent 'Exporter';
our @EXPORT = qw( minha_funcao );

sub minha_funcao {
  …
}

1;


                             Perl Moderno
use lib 'lib';

use Meu::Modulo;

Meu::Modulo::minha_funcao();




                        Perl Moderno
use lib 'lib';

use Meu::Modulo;

minha_funcao();




                   Perl Moderno
Evite exportar muitas funções para
o namespace do invocante, a menos
   que esteja definindo uma DSL
    ou saiba o que está fazendo

                           Perl Moderno
package Meu::Modulo;

use 5.12.0;
use warnings;
use parent 'Exporter';
our @EXPORT = qw( minha_funcao );

sub minha_funcao {
  …
}

1;


                             Perl Moderno
package Meu::Modulo;

use 5.12.0;
use warnings;
use parent 'Exporter';
our @EXPORT_OK = qw( minha_funcao );

sub minha_funcao {
  …
}

1;


                             Perl Moderno
use lib 'lib';

use Meu::Modulo;

minha_funcao();




                   Perl Moderno
use lib 'lib';

use Meu::Modulo 'minha_funcao';

minha_funcao();




                        Perl Moderno
Não importe nada colocando ()
depois da declaração do módulo

        use Modulo ();

                          Perl Moderno

Perl Moderno, dia4