perl 检查嵌套哈希引用

标签 perl key defined hashref autovivification

我有以下代码:

#!/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' => {}
                      }
        };

正如您所看到的,检查用户是否在嵌套结构中定义实际上会创建一个空键。我的问题是如何在不定义键的情况下检查哈希引用。

最佳答案

你在“自动复活”方面遇到了困难。 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 可以轻松关闭部分代码中的自动激活。所以只需添加:

no autovivification;

在导致问题的代码块中。

更新:还有手动方法,其中涉及检查数据结构的每个级别,并在发现与您要查找的内容不匹配的内容时立即停止查找:

$ perl -MData::Dumper -E'if ("HASH" eq ref $foo and exists $foo->{bar} and !$foo->{bar}->{baz}){}; say Dumper $foo'
$VAR1 = undef;

关于perl 检查嵌套哈希引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63506230/

相关文章:

lua - 从值中获取表键名

php - 从 csv php 创建键值对

perl - 如果定义了调用函数的简短语法

perl - 如何使用 IIS 7.5 配置 Perl/FCGI (FastCGI)?

Perl - 是类的对象实例吗?

java - ContainsValue 与 equals 方法 TreeMap

c++ - 出现 LNK2005 和 KNK1169 错误 - 包括一个类在另一个类中

Python- raw_input 不工作

linux - 安装perl时缺少libgdbm

perl - Perl 中的配置文件处理