Re: [MacPerl] passing a reference to a hash element
[email protected] (Joshua Juran) Mon, 24 Jan 2005 09:52:11 -0500
| Newsgroups | perl.macperl |
|---|---|
| Message-ID | <[email protected]> |
On Jan 24, 2005, at 9:09 AM, Louis Pouzin wrote:
> I call a subroutine with a reference to a hash element.
> In the subroutine I want to test if the element exists.
If you've taken a reference to the hash element, then it exists (after
autovivification, if necessary). In the cat example, you're passing a
hash reference and a key.
> If so, I want to get the key and the value of the element.
> I can't figure out the correct syntax.
> So far I can only get the value. Could someone prompt me ?
It's been a few years, but off the top of my head...
> #!perl -w
> use strict; $\ = "\n";
> my %H;
> $H{one}{two}{three} = 'nut';
> print exists $H{one}{two}{three}; # 1
> cat(\$H{one}{two},'three');
> dog(\$H{one}{two}{three});
>
> sub cat{
> print $_[1]; # three
> # exists ${$_[0]}; # not a HASH element
> # exists ${$_[0]}{$_[1]}; # not a HASH reference
> # exists ${$_[0]}{"$_[1]"}; # not a HASH reference
> # exists $_[0]{"$_[1]"}; # not a HASH reference
> }1;
My recollection is that $H{one}{two} is shorthand for $H{one}->{two}.
That is, a hash only stores references, and a nested hash is stored in
a containing hash by its reference. So $H{one}{two} evaluates to a
reference to a hash with a single key 'three' and the value 'nut'.
Therefore, \$H{one}{two} is a scalar reference, a reference to a
reference to a hash. The correct syntax would be $(${$_[0]}}{$_[1]},
or just ${$_[0]}{$_[1]} if you drop the '\'.
> sub dog{
> print ${$_[0]}; # nut
> # exists $_[0]; # not a HASH element
> # exists ${$_[0]}; # not a HASH element
> # exists ${${$_[0]}}; # not a HASH element
> }1;
Again, you're passing a reference to a scalar. This time, the scalar
is the string 'nut' instead of a hash reference. You can't test for
existence because you've already subscripted the hash.
Josh
--
Joshua Juran
Metamage Software Creations - Mac Software and Consulting
http://www.metamage.com/
* Creation at the highest state of the art *