Reputation: 8386
If I have deep multi-level (dynamic) hash-structure, I try to reference deeper parts through separate variables, something like this:
my $multilevel_dynamic_hash;
my $dynamic_a = int( rand() * 100 );
my $dynamic_b = int( rand() * 100 );
my $dynamic_c = int( rand() * 100 );
$multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c } = {};
my $reference_as_hashref = $multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c };
call_to_some_subroutine( $reference_as_hashref );
Now, instead of those two lines
$multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c } = {};
my $reference_as_hashref = $multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c };
is there possible to avoid the first line and declare $reference_as_hashref
so that it treats the last part ($dynamic_c
) as key to the next level of hash?
EDIT
I'd like to take reference, something like this:
my $reference_as_hashref = $multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c }{};
NB! last {}
Instead, first I have to tell that the value is hashref and then I can reference it. Is it possible with one step?
Upvotes: 1
Views: 95
Reputation: 386331
If the goal is to reduce code duplication, you could simply change the order in you which you assign things.
For example,
$multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c } = {};
my $hashref = $multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c };
and
my $hashref = {};
$multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c } = $hashref;
produce the same result.
However, there is an even simpler solution.
$multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c } = {};
my $hashref = $multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c };
can also be written as
my $hashref = $multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c } = {};
Scalar assignment is right-associative, so $a = $b = $c;
is equivalent to $a = ( $b = $c );
. It returns its left-hand side, so $a = ( $b = $c )
is equivalent to $b = $c; $a = $b;
Upvotes: 4