http://www.perlmonks.org?node_id=1011266


in reply to Syntax explanation required

Hello ghosh123,

LanX has explained the syntax of the expression, but you may be wondering, why create a hash reference only to immediately dereference it?

A solution using a third, named hash is more straightforward:

my %hash3 = (%hash1, %hash2); my @uniq = keys %hash3;

But what happens if we want to eliminate the named hash? The obvious approach:

my @uniq = keys (%hash1, %hash2);

doesn’t work, because the Perl interpreter sees only a simple list. So it’s necessary to tell the interpreter to create a hash, but the only syntax for this that doesn’t involve another named hash is curly braces {}, which creates a hash as required but returns a reference to it. Hence the need for the more complicated syntax which creates the hash reference and then dereferences it.

Actually, however, this isn’t necessary in Perl 5.14 or later, because keys can now also take a hash reference as its argument:

#! perl use Modern::Perl; use Data::Dump; my %hash1 = (fred => 'wilma', barney => 'betty'); my %hash2 = (homer => 'marge', fred => 'wilma'); my @uniq = keys { %hash1, %hash2 }; dd @uniq;

Output:

23:05 >perl 464_SoPW.pl ("barney", "homer", "fred") 23:08 >

Hope that helps,

Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,