Opa! Obrigado a todos!
A cagada era copiar a referência para um scalar. O lance é copiar para um hash, de fato, dentro do loop, e fazer o push da referência desse hash. <code> use Data::Printer colored => 1; my @a = ("amarelo","branco","vermelho"); my $p={id=>1,nome=>"foo"}; my @b = (); foreach my $c(@a){ my %p = %$p; $p{cor} = $c; push @b,\%p; } print p @b; </code> Obrigado a todos, e um abraço! 2014-09-30 11:10 GMT-03:00 Tiago Peczenyj <tiago.pecze...@gmail.com>: > 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 <andregarciacarne...@gmail.com>: > >> 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: SaoPaulo-pm@pm.org >> 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: SaoPaulo-pm@pm.org > L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> > =end disclaimer > > -- André Garcia Carneiro Software Engineer (11)982907780
=begin disclaimer Sao Paulo Perl Mongers: http://sao-paulo.pm.org/ SaoPaulo-pm mailing list: SaoPaulo-pm@pm.org L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> =end disclaimer