in reply to Re^7: Combinations of lists, etc
in thread Combinations of lists to a hash

> Further to LanX's reply:

And further to your reply ... ;-)

plain printing of the references reveals that the last are identical objects

DB<61> @ra = ({a=>1, b=>2}, {a=>1, b=>2}); DB<62> print $_ for @ra HASH(0x35a4090)HASH(0x35a3ae8) # different IDs DB<63> @ra = ({a=>1, b=>2}) x 2; DB<64> print $_ for @ra HASH(0x35a3eb0)HASH(0x35a3eb0) # same IDs DB<65>

> Update: dd works by generating source code that will reproduce the structure of the data being dumped.

... when run thru eval .

There seems to be no better generic syntax to reproduce the case of duplicated references, than stuffing a fix placeholder string into it and fixing it later.

An for completeness, here code to clone the hashes instead of copying their refs

my $value = { a=>1, b=>2 }; # curly brackets to assign hashref! $hash{$_} = { %$value } for @keys; ### or alternatively my %value = ( a=>1, b=>2 ); # round brackets to assign list! $hash{$_} = { %value } for @keys;

this kind of cloning works because % returns a list in listcontext, which is packed again into a new { hash }

DB<78> x %$value 0 'a' 1 1 2 'b' 3 2 DB<79>

debugger demo

DB<72> x @keys 0 'Prefix1=A:b:1' 1 'Prefix1=A:b:2' 2 'Prefix1=A:c:1' 3 'Prefix1=A:c:2' DB<73> x $value = {a=>1, b=>2}; 0 HASH(0x35a48e8) 'a' => 1 'b' => 2 DB<74> $hash{$_} = { %$value } for @keys; DB<75> x \%hash 0 HASH(0x3598330) 'Prefix1=A:b:1' => HASH(0x35a50b8) 'a' => 1 'b' => 2 'Prefix1=A:b:2' => HASH(0x35a4c18) # <--- differing IDs 'a' => 1 'b' => 2 'Prefix1=A:c:1' => HASH(0x35a46a8) 'a' => 1 'b' => 2 'Prefix1=A:c:2' => HASH(0x35a4a50) 'a' => 1 'b' => 2 DB<77>

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

Replies are listed 'Best First'.
Re^9: Combinations of lists, etc
by AnomalousMonk (Archbishop) on Oct 07, 2019 at 17:48 UTC

    And further to your further to my further to... wait... what?!? :)

    $hash{$_} = { %$value } for @keys;
    ...
    $hash{$_} = { %value } for @keys;

    I always think it's worth pointing out in discussions on this topic that something like  { %$value } or  { %value } only does a shallow copy.


    Give a man a fish:  <%-{-{-{-<

      further4: ;-)

      > only does a shallow copy.

      yes, but at this point maybe already too much information for the OP.

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery FootballPerl is like chess, only without the dice