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


in reply to Re: Perl Internals: Hashes
in thread Perl Internals: Hashes

To expound on demerphq's response with an example:

Given a hash, like so:

my %test; $test{a} = 1; $test{b} = 2;
When you call a subroutine with an array or hash, it gets flattened into a list. For a hash, that means giving all of its keys and corresponding values. So this:
something(%test);
is the same as this:
something(a, 1, b, 2);
(Note that when hashes are flattened, the keys may come out in any order, so it could have also been something(b, 2, a, 1);.)

The other side of this situation is that you can fill a hash directly with a list, instead of doing each key one-at-a-time. When you assign to a hash with a list, each odd item becomes a key, and the corresponding even item is its value. So we could have filled the hash like this:

%test = (a, 1, b, 2);
and it would be exactly the same. Note that this is also the same as the more familiar:
%test = (a => 1, b => 2);
as the => is just a type of comma that auto-quotes its left side operand. Now you can see what happens:
something(%test); # is like something(a, 1, b, 2);
And inside the sub:
my %hash = @_; # is like %hash = (a, 1, b, 2);
And so it turns out that you're just doing a basic copy. The hash inside the sub will be a copy of the one you passed in.