[SP-pm] dúvida básica

Andre Carneiro andregarciacarneiro at gmail.com
Tue Sep 30 07:37:39 PDT 2014


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20140930/332b4a7c/attachment.html>


More information about the SaoPaulo-pm mailing list