André, é porque você está manipulando o mesmo endereço da memória. Você pode desreferenciar e adicionar o atributo "cor" na mesma expressão do "push".
<code> use Data::Printer; my @a = ( 'amarelo', 'branco', 'vermelho' ); my $p = { id => 1, nome => "foo" }; my @b = (); foreach my $c (@a) { push @b, ( { %{$p}, cor => $c } ); } print p @b; </code> 2014-09-30 11:37 GMT-03:00 Andre Carneiro <andregarciacarne...@gmail.com>: > 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 > > -- -dom -- Daniel de Oliveira Mantovani Business Analytic Specialist Perl Evangelist /Astrophysics hobbyist. +55 11 9 8538-9897 XOXO
=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