in reply to Hash of Hash of Array Syntax help

I find it helps to add a little white space and remove the "extra" set of () that aren't required for push:

push @{$genes{$r[0]}{$r[1]}{$r[2]}}, $r[3];

genes must be a hash because it's being accessed using{} and it contains a series of nested hashes because there is a chain of {}{}: {$r[0]}{$r[1]}{$r[2]}. r is an array which you can tell because it's being accessed using []. The @{} wrapper around the genes access turns an array reference into an array (that's what the @ is about).

So the whole thing pushes the fourth element of @r into an array stored in a hash stored in a hash stored in %genes.

True laziness is hard work

Replies are listed 'Best First'.
Re^2: Hash of Hash of Array Syntax help
by ZWcarp (Beadle) on Jan 12, 2012 at 23:16 UTC
    Ok thanks a ton.. so let me clarify to see if I get it... in this situation based on what you said :
    foreach my $key1 ( sort keys %genes ) { print "\t". scalar (keys %{$genes{$key1}}) . "\t"; foreach my $key2 ( sort keys %{$genes{$key1}} ) { etc....
    I am printing the number of hash keys at the $gene{$r4} level...... and the %{} is a wrapper that turns a hash reference into a hash? ( as opposed to above where its an @ ref into an @. So changing that reference to an actual hash allows me to see the true values of the keys ( or in this instance the number of them because of the scalar command) rather then seeing the hash reference? If the wrapper were not to be there and I tried to access a deeper level in the hash rather then just printing the values at that level, it wouldn't work because the values themselves don't store the information for the overall nested structure (thats what the refs are for) ..correct?