[Rio-pm] Mojolicious - Duvidas

breno breno em rio.pm.org
Quinta Abril 12 12:11:53 PDT 2012


On Thu, Apr 12, 2012 at 3:11 PM, Manoel Domingues Junior
<manoel.domingues.junior em gmail.com> wrote:
> Olá pessoal,
>
> Estou tentando montar um crawller, mas estou empacado.
>
> No meu maior problema está sendo em como fazer para pegar o conteúdo que
> aparece ao lado de Heading e colocá-lo em uma varíavel.
>
>   use Mojo::UserAgent;
>
>   # Fetch web site
>   my $ua = Mojo::UserAgent->new;
>   my $tx = $ua->get('mojolicio.us/perldoc');
>
>   # Extract title
>   say 'Title: ', $tx->res->dom->at('head > title')->text;
>
>   # Extract headings
>   $tx->res->dom('h1, h2, h3')->each(sub {
>     say 'Heading: ', shift->all_text;
>   });
>
>
> Executando esse código (ele está na página do Mojolicious) teremos:
>
> Title: Mojolicious::Guides - Mojolicious guide to the galaxy
> Heading: TABLE OF CONTENTS
> Heading: NAME
> Heading: DON'T PANIC!
> Heading: LEARNING PERL
> Heading: TUTORIAL
> Heading: GUIDES
> Heading: HIGHLIGHTS
> Heading: MORE
>
> O que não estou conseguindo fazer é colocar, por exemplo, o "TABLE OF
> CONTENTS" dentro de uma variável. Ou seja, não estou entendo o funcionamento
> do shift...
>

"shift" nada mais é do que "retire o primeiro elemento da lista e
use-o". Por exemplo:

my @lista = (1, 2, 3);

my $elemento = shift @lista;

a variável $elemento terá "1", e @lista passará a ter apenas 2
elementos: (2, 3).

No caso do código acima o "shift" está sendo usado sem argumentos, o
que significa que ele vai usar a lista padrão dentro de uma sub, ou
seja, a lista de elementos recebidos pela sub (sempre na variável @_).

Veja seu código:

   $tx->res->dom('h1, h2, h3')->each(sub {
     say 'Heading: ', shift->all_text;
   });

É a mesma coisa que fazer:

   $tx->res->dom('h1, h2, h3')->each(sub {
     my $element = shift;
     say 'Heading: ', $element->all_text;
   });

Que é a mesma coisa que fazer:

   $tx->res->dom('h1, h2, h3')->each(sub {
     my $element = shift @_;
     say 'Heading: ', $element->all_text;
   });

Ou seja, para obter todos os headings, vc pode fazer algo como:

  my @headings = ();

  # Extract headings
  $tx->res->dom('h1, h2, h3')->each(sub {
    push @headings, shift->all_text;
  });

  say $heading[0];   # "TABLE OF CONTENTS"

Entendeu?

Veja "perldoc -f shift" para mais informações. Fazer direto
shift->algum_metodo é um idioma comum em Perl, quando vc não se
importa com os outros elementos recebidos, apenas o primeiro, e só
quer fazer uma única coisa com ele (como imprimir usando "say", ou
colocar numa lista @headings, usando "push").

Se tiver mais alguma dúvida é só falar! Ou nos procure em
irc.perl.org, no canal #rio-pm, para um live chat!

Ou MELHOR AINDA!! Venha ao encontro social hoje! A partir de 19h na
esquina da rua Alice com a rua das Laranjeiras, e bata um papo com a
gente!

[]s

breno


Mais detalhes sobre a lista de discussão Rio-pm