w.k
w.k

Reputation: 8386

Is there better way to reference as hash?

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

Answers (1)

ikegami
ikegami

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

Related Questions