[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