有没有一种简单的方法来验证哈希元素的哈希是否存在并被定义?

WL.*_*WL. 5 perl hash nested defined

我需要验证哈希元素的Perl哈希,例如$Table{$key1}{$key2}存在和定义.这就是我的工作.(我$key1甚至不知道存在)

if 
((defined $Table{$key1}) &&
 (exists  $Table{$key1}) &&
 (defined $Table{$key1}{$key2}) &&
 (exists  $Table{$key1}{$key2})) 
{
   #do whatever
}
Run Code Online (Sandbox Code Playgroud)

有更简单,更清洁的方法吗?

Eth*_*her 8

你不需要检查层次结构的每个级别:你可以只追求你关心的价值.exists不检查定义,只有散列中的槽存在(它可能存在未定义的值),所以如果你关心定义了值,你需要调用defined而不是存在.如果没有定义一个值,它在布尔上下文中的计算结果为false,所以我们可以输入一点,并将你的例子减少到:

if ($Table{$key1}{$key2})
{
   # do whatever
}
Run Code Online (Sandbox Code Playgroud)

但是,如果该键中的值已定义但为"false"(数值计算为零,或者为空字符串),则可能导致错误否定,因此如果可能,我们应明确检查定义:

if (defined $Table{$key1}{$key2})
{
   # do whatever
}
Run Code Online (Sandbox Code Playgroud)

如果你不想自动更新$Table{$key1},你可以先检查它的存在,这使我们得到了一般情况的"最佳"方式:

if (exists $Table{$key1} and defined $Table{$key1}{$key2})
{
   # do whatever
}
Run Code Online (Sandbox Code Playgroud)

如果你要为哈希中的各个字段做很多事情,你可能想要添加一些OO风格的访问器方法,这将为你工作:

sub has_field
{
    my ($this, $fieldName) = @_;
    return exists $this->{data} && defined $this->{data}{$fieldName});
}
Run Code Online (Sandbox Code Playgroud)

我确定你已经阅读过了,但再次阅读相关文档并不会有什么坏处:

给定一个指定哈希元素或数组元素的表达式,exists如果哈希或数组中的指定元素已被初始化,则返回true,即使相应的值未定义.如果元素不存在,则该元素不会自动生成.
...
散列或数组元素只有在定义时才能为真,如果存在则定义,但反过来不一定适用.

  • 意外的自动更新是错误的.不要忽视它,并制造一些以后会咬人的坏习惯. (4认同)
  • 如果它不存在,这将永远是autovivifiy` $ Table {$ key1}` (2认同)
  • 自动生成并不重要...直到它完成,然后它是一个PITA来调试你的哈希中的伪造数据(在你的密钥/值循环时腐败的任何时候)来自哪里. (2认同)

Eri*_*rom 6

以下内容较短,可防止自动生成:

 if (exists $table{$key1} and defined $table{$key1}{$key2}) {...}
Run Code Online (Sandbox Code Playgroud)

不需要代码中的其他检查.