On 11/10/09 Tue Nov 10, 2009 1:22 PM, "Bryan R Harris"
<[email protected]> scribbled:
>
>
> I have a curiosity maybe someone here can help with.
>
> This code:
>
> @a=(1,2);
> map { $_ = 3 } @a;
> print join(",", @a), "\n";
>
> ... prints "3,3". That map is changing the @a array as it goes through it.
> Good.
>
> Now this:
>
> %a=(1,2);
> map { $_ = 3 } keys %a;
> print join(",", keys(%a)), "\n";
>
> I expected this to print "3", but it doesn't -- it prints "1". If map sets
> $_ as an alias to the value, why isn't it changing the keys?
Because the keys() subroutine generates a list of keys that are not aliases
to the keys in the hash.
It is not a good idea to change the "values" of keys in a hash, because
finding the (key,value) pair for a specific key depends upon a key value
being located in a specific location ("bucket") within the hash. If you
change the key value in place, the hash access algorithm will no longer be
able to find the (key,value) pair.
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/