首页 > 解决方案 > 有没有更好的方法来引用哈希?

问题描述

如果我有深度的多级(动态)哈希结构,我会尝试通过单独的变量引用更深的部分,如下所示:

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 );

现在,而不是那两条线

$multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c } = {};
my $reference_as_hashref = $multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c };

是否有可能避免第一行并声明$reference_as_hashref,以便将最后一部分($dynamic_c)视为下一级哈希的关键?

编辑

我想参考一下,像这样:

my $reference_as_hashref = $multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c }{};

注意!最后的{}

相反,首先我必须告诉该值是 hashref 然后我可以引用它。一步可以吗?

标签: perl

解决方案


如果目标是减少代码重复,您可以简单地更改您分配事物的顺序。

例如,

$multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c } = {};
my $hashref = $multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c };

my $hashref = {};
$multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c } = $hashref;

产生相同的结果。

但是,还有一个更简单的解决方案。

$multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c } = {};
my $hashref = $multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c };

也可以写成

my $hashref = $multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c } = {};

标量赋值是右结合的,所以$a = $b = $c;等价于$a = ( $b = $c );. 它返回它的左边,所以$a = ( $b = $c )等价于$b = $c; $a = $b;


推荐阅读