[SP-pm] dúvida básica
Daniel de Oliveira Mantovani
daniel.oliveira.mantovani at gmail.com
Wed Oct 1 16:22:21 PDT 2014
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 <andregarciacarneiro at 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.peczenyj at 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 <andregarciacarneiro at 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 at 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 at 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 at 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20141001/8346985c/attachment.html>
More information about the SaoPaulo-pm
mailing list