[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