[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