首页 > 解决方案 > 使用字符串访问多维哈希

问题描述

我有一个大型多维哈希,它是 JSON 结构的导入。

my %bighash;

%bighash 中有一个元素叫做:

$bighash{'core'}{'dates'}{'year'} = 2019.

我有一个名为 core.dates.year 的单独字符串变量,我想用它从 %bighash 中提取 2019。

我写了这段代码:

my @keys  = split(/\./, 'core.dates.year');
my %hash = ();
my $hash_ref = \%hash;

for my $key ( @keys ){
    $hash_ref->{$key} = {};
    $hash_ref = $hash_ref->{$key};
}

当我执行时:

say Dumper \%hash;

输出:

$VAR1 = {
          'core' => {
                   'dates' => {
                             'year' => {}
                           }
                 }
        };

到目前为止一切都很好。但我现在想做的是说:

print $bighash{\%hash};

我想返回 2019 年。但没有返回任何内容,或者我看到有关“在连接 (.) 或 script.pl 第 1371 行第 17 行 (#1) 的字符串中使用 %bighash 中的未初始化值.. .

有人可以指出发生了什么吗?

我的项目涉及将字符串嵌入到外部文件中,然后将其替换为 %bighash 中的实际值,因此它只是字符串插值。

谢谢!

标签: perlhash

解决方案


有人可以指出[当我使用$bighash{\%hash}]发生了什么吗?

哈希键是字符串,字符串化\%hash类似于HASH(0x655178). 中唯一的元素%bighashcore-not HASH(0x655178)- 作为键,因此哈希查找返回undef.


有用的工具:

sub dive_val :lvalue { my $p = \shift; $p //= \( $$p->{$_} ) for @_; $$p }   # For setting
sub dive { my $r = shift; $r //= $r->{$_} for @_; $r }                       # For getting

dive_val(\%hash, split /\./, 'core.dates.year') = 2019;
say dive(\%hash, split /\./, 'core.dates.year');

推荐阅读