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)
有更简单,更清洁的方法吗?
你不需要检查层次结构的每个级别:你可以只追求你关心的价值.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,即使相应的值未定义.如果元素不存在,则该元素不会自动生成.
...
散列或数组元素只有在定义时才能为真,如果存在则定义,但反过来不一定适用.
以下内容较短,可防止自动生成:
if (exists $table{$key1} and defined $table{$key1}{$key2}) {...}
Run Code Online (Sandbox Code Playgroud)
不需要代码中的其他检查.