por que $p nesse caso é uma referencia. vc esta reusando uma referencia a um hash nos 3 itens desse array no loop.
para evitar, declare %p dentro do loop e passe a referencia dele no array. 2014-09-30 11:04 GMT-03:00 Andre Carneiro <[email protected]>: > Salve monges > > Desculpem incomodar vocês com essa dúvida básica, mas não estou > encontrando a idiotice que estou fazendo, e isso já está me consumindo > algum tempo. Abaixo, um código resumido que reproduz o problema: > > > <code> > > use Data::Printer; > my @a = ('amarelo','branco','vermelho'); > my $p = {id=>1,nome=>"foo"}; > my @b = (); > foreach my $c(@a){ > $p->{'cor'} = $c; > push @b,$p; > } > print p @b; > > </code> > > Resultado: > [ > [0] { > cor "vermelho", > id 1, > nome "foo" > }, > [1] var[0], > [2] var[0] > ] > > Resultado esperado: > [ > [0] { > cor "vermelho", > id 1, > nome "foo" > }, > [1] { > cor "amarelo", > id 1, > nome "foo" > }, > [2] { > cor "preto", > id 1, > nome "foo" > } > ] > > > A pergunta é simples. Porque não consigo o resultado esperado? > > > Obrigado! > > -- > André Garcia Carneiro > Software Engineer > (11)982907780 > > =begin disclaimer > Sao Paulo Perl Mongers: http://sao-paulo.pm.org/ > SaoPaulo-pm mailing list: [email protected] > L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> > =end disclaimer > > -- Tiago B. Peczenyj Linux User #405772 http://about.me/peczenyj
=begin disclaimer Sao Paulo Perl Mongers: http://sao-paulo.pm.org/ SaoPaulo-pm mailing list: [email protected] L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> =end disclaimer
