perl - 使用字符串访问多维哈希
问题描述
我有一个大型多维哈希,它是 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 中的实际值,因此它只是字符串插值。
谢谢!
解决方案
有人可以指出[当我使用
$bighash{\%hash}
]发生了什么吗?
哈希键是字符串,字符串化\%hash
类似于HASH(0x655178)
. 中唯一的元素%bighash
有core
-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');
推荐阅读
- regex - TypeDoc如何定义externalPattern?
- rest - 使用 REST 读取 Nexus 2.x 日志
- sql - 时间序列数据的大查询
- spring - Spring Cloud - WebMvcConfigurerAdapter 无法自动装配 feign 客户端
- angular - ASP.NET Core with Angular Template 由 Microsoft VS ASP.NET CORE WITH ANGULAR CLI
- javascript - Rxjs 5 到 6 迁移在 Angular 6 升级期间不起作用
- c# - LINQ to SQL 检查 Datetime 是否为空或小于当前日期
- c - 使用 CGo 调用具有双指针输出参数的 C 函数
- php - 如何在 php 控制台中创建数据库监听器
- python - 使用正则表达式从python中的字符串中搜索子字符串+整数