Perl question: array member of referenced hash

Perl question: array member of referenced hash

Gabor Szabo szabgab at gmail.com
Sat Oct 24 23:01:48 IST 2009


2009/10/24 Shachar Shemesh <shachar at shemesh.biz>:
> Noam Rathaus wrote:
>
> Shachar,
>
> { } in Perl are casting when they surround a value
> And the second set of { } around the 'a' mean variable of Hash
>
>
>
>
> Grumble grumble grumble....

not surprised as this is one of the funky places of Perl 5.

>
> Okay, I'm sorry for being difficult. I really couldn't find the answer in
> the Perl documentation.
>
> I understand the second set of curly braces. I also, somewhat, understand
> that the -> replaces the % (i.e. - reference dereferencing). What I'm not so
> clear is what the first set of curly braces do (what do you mean by
> "casting" - casting to what? How is that decided?). I'm also not clear on
> why the surrounding round brackets are needed. I understand they are so this
> will be a list context, but I don't understand why it's needed once I put a
> @ to dereference the array.
>
> Thanks,
> Shachar
>
> foreach my $elem (@{$ref->{a}})


err, I don't think that "casting" is the right word to use here. What
{} does here is
disambiguates the expression. Here is a table

$x - scalar
@x - array
%x - hash

$ra = \@x  reference to array

sticking @ infront of the reference to an array dereferences it
@x is the same as @$ra   (you could also write and @{$ra} but it is
not necessary)
$x[1]  is the same as  $$ra[1]   (element of array, replace @ by $ and
attach the index)
         but it is ugly so it can also be written as $ra->[1]


$rh = \%x  reference to hash

sticking % infront of the reference to a hash dereferences it
%x is the same as %$rh  (could be also written as %{$rh} but it is not
necessary)
$x{foo} is the same as $$fh{foo} which is the same as $fh->{foo}

Now what if you have two dimensions: first dimension is a hash second
dimension is an array.

%h  is a hash
@something = ('foo');
$h{a} = \@something;

Which means
print $h{a}[0];    # 'foo';


$ref = \%h;   reference to hash

%h is the same as %$ref
$h{a}  is the same as $$ref{a}  or as $ref->{a} which is the reference
to the array: \@something

sticking @ in front of it would dereference the array which would yield

@$h{a}   or  @$$ref{a}  @$ref->{a}   which is the same as @something

but it is not clear what does either of these mean
(looking at the last one, @$ref could mean $ref is a reference to an array and
that you are dereferencing @$ref  and the resulting thingy is a hash ref)

So we wrap the reference in a curly brace to make it clear that is a
single variable:

@{$h{a}}   or  @{$$ref{a}}  @{$ref->{a}}  which is the same as @{something}

so the {} is basically around the "name' of the variable.



Hope this helps
   Gabor



More information about the Linux-il mailing list