gpt4 book ai didi

perl - 是否有一种简单的方法来验证散列元素的散列是否存在并已定义?

转载 作者:行者123 更新时间:2023-12-04 16:37:22 24 4
gpt4 key购买 nike

我需要验证散列元素的 Perl 散列,例如 $Table{$key1}{$key2}存在并被定义。这就是我所做的。 (我不知道 $key1 甚至存在)

if 
((defined $Table{$key1}) &&
(exists $Table{$key1}) &&
(defined $Table{$key1}{$key2}) &&
(exists $Table{$key1}{$key2}))
{
#do whatever
}

有没有更简单、更干净的方法来做到这一点?

最佳答案

您无需检查层次结构的每个级别:您只需选择您关心的值即可。 exists不检查定义性,仅当哈希中的插槽存在时(它可能存在未定义的值),所以如果您关心该值是否已定义,则需要调用 defined而不是存在。如果未定义值,则它在 bool 上下文中评估为 false,因此我们可以少输入一点并将示例简化为:

if ($Table{$key1}{$key2})
{
# do whatever
}

但是,如果该键中的值已定义但为“false”(数值计算为零,或者是空字符串),则可能会导致误报,因此我们应该明确检查定义是否有可能:
if (defined $Table{$key1}{$key2})
{
# do whatever
}

如果您不想自动激活 $Table{$key1} ,您可以先检查它是否存在, 这将我们带到一般情况下的“最佳”方式 :
if (exists $Table{$key1} and defined $Table{$key1}{$key2})
{
# do whatever
}

如果您要对散列中的各个字段进行大量操作,您可能需要添加一些 OO 样式的访问器方法,这些方法可以为您完成这项工作:
sub has_field
{
my ($this, $fieldName) = @_;
return exists $this->{data} && defined $this->{data}{$fieldName});
}

我确定您已经阅读过它,但再次阅读相关文档也无妨:
  • perldoc -f exists
  • perldoc perldata
  • perldoc perldsc

  • Given an expression that specifies a hash element or array element, exists returns true if the specified element in the hash or array has ever been initialized, even if the corresponding value is undefined. The element is not autovivified if it doesn't exist.
    ...
    A hash or array element can be true only if it's defined, and defined if it exists, but the reverse doesn't necessarily hold true.

    关于perl - 是否有一种简单的方法来验证散列元素的散列是否存在并已定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2723518/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com