perl - perl 检查嵌套哈希引用
问题描述
我有以下代码:
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
my $site = "test.com";
my $data = {
"test" => 1
};
my $user = defined($data->{addons}->{$site}->{username}) ? $data->{addons}->{$site}->{username} : "nothing";
print Dumper($data);
结果:
$VAR1 = {
'test' => 1,
'addons' => {
'test.com' => {}
}
};
如您所见,检查用户是否在嵌套结构中定义实际上创建了一个空键。我的任务是如何在不定义键的情况下检查 hashref。
解决方案
你在“autovivification”上磕磕绊绊。Perl 会自动在您尝试访问的数据结构中创建中间层。你可以在这里看到它的实际效果:
$ perl -MData::Dumper -E'if (!$foo->{bar}->{baz}){}; say Dumper $foo'
$VAR1 = {
'bar' => {}
};
为了检查是否$foo->{bar}->{baz}
为真,Perl 创建了$foo->{bar}
. 这使得创建复杂的数据结构变得容易,但在查询它们时可能会出现问题。
但是看看这个:
$ perl -M-autovivification -MData::Dumper -E'if (!$foo->{bar}->{baz}){}; say Dumper $foo'
$VAR1 = undef;
autovivification pragma 使您可以轻松地在部分代码中关闭 autovivification。所以只需添加:
no autovivification;
在导致问题的代码块中。
更新:还有手动方法,其中包括检查数据结构的每一层,并在发现与您要查找的内容不匹配时立即停止查找:
$ perl -MData::Dumper -E'if ("HASH" eq ref $foo and exists $foo->{bar} and !$foo->{bar}->{baz}){}; say Dumper $foo'
$VAR1 = undef;
推荐阅读
- javascript - ReactJS:组件数组问题
- angular - 为什么我在 NgOnInit 中的服务在按钮单击时不断被应用程序调用?
- machine-learning - 每个标签的 get_feature_names
- google-app-maker - 如何将元标记添加到 AppMaker 头部
- typescript - 如何使打字稿编译器打印正在编译的文件名列表?
- c++ - 为什么 ELF 部分的静态成员指针为零?
- python - 无法使用与“base”相同的 python 版本创建新的 conda 环境
- sql-server - 根据除法运算结果拆分行
- sql - 将字符串值转换为天数
- nestjs - 如何包含需要通过导入模块注入请求的请求范围提供程序