[Rio-pm] Imprimindo array no mojolicious

breno breno em rio.pm.org
Segunda Abril 25 15:06:00 PDT 2011


2011/4/25 breno <breno em rio.pm.org>:
> o problema é que se Package->function retorna um array, vc precisa
> atribuir ele a uma única posição no hash, o que se faz passando
> referência ao dito array:
>
> $self->stash( one => [ Package->function() ] );
>

Apenas caso não tenha ficado claro para alguém, aqui vai uma breve explicação.

Um hash representa dados na forma de chave/valor, ou, mais
especificamente: chave, valor, chave, valor, chave, valor, ...

Assim, podemos criar um hash da seguinte forma:

my %autor_do_livro = (
   'Oscar Wilde', 'Retrato de Dorian Gray',
   'H. P. Lovecraft', 'Chamado de Cthulhu',
   'Machado de Assis', 'A Mão e a Luva',
);

Perl oferece o operador '=>', que funciona como a vírgula (com algumas
particularidades que não vem ao caso), de modo que nos permite definir
nosso hash de forma bem mais legível:

my %autor_do_livro = (
   'Oscar Wilde' => 'Retrato de Dorian Gray',
   'H. P. Lovecraft' => 'Chamado de Cthulhu',
   'Machado de Assis' => 'A Mão e a Luva',
);

Para associarmos um único elemento (como uma chave de hash ou uma
posiçào de array) a uma coleção de elementos (como outro hash ou
array), armazenamos no local uma referência à nossa coleção original.
Por exemplo:

my @livros_do_machado = ( 'A Mão e a Luva', 'Dom Casmurro' );

my %autor_do_livro = (
   'Oscar Wilde' => 'Retrato de Dorian Gray',
   'H. P. Lovecraft' => 'Chamado de Cthulhu',
   'Machado de Assis' => \@livros_do_machado,
);

Ou, sem precisar de variáveis intermediárias:

my %autor_do_livro = (
   'Oscar Wilde' => 'Retrato de Dorian Gray',
   'H. P. Lovecraft' => 'Chamado de Cthulhu',
   'Machado de Assis' => [ 'A Mão e a Luva', 'Dom Casmurro' ],
);

Se não usarmos referências, estamos efetivamente dizendo ao Perl para
aumentar o próprio hash, e o código vira:

my %autor_do_livro = (
   'Oscar Wilde' => 'Retrato de Dorian Gray',
   'H. P. Lovecraft' => 'Chamado de Cthulhu',
   'Machado de Assis' => 'A Mão e a Luva', 'Dom Casmurro',
);

que é o mesmo que:

my %autor_do_livro = (
   'Oscar Wilde' => 'Retrato de Dorian Gray',
   'H. P. Lovecraft' => 'Chamado de Cthulhu',
   'Machado de Assis' => 'A Mão e a Luva',
   'Dom Casmurro' => undef,
);

e gera um warning de que a quantidade de elementos no hash é ímpar,
dando a dica do problema caso estejamos com sorte (afinal, o código é
válido em casos do número de elementos ser par).

O erro é fácil de ver quando usamos elementos explícitos, mas ficam
mascarados em casos como:

   'Machado de Assis' => @livros_do_machado,  # notem a ausência da referência

ou o retorno de uma função, como:

   one => Package->function(),   # ok apenas se function() retornar um escalar

e podem passar despercebidos com facilidade.

Bom, é isso. Espero ter ajudado =)

[]s

garu


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