【发布时间】:2015-11-25 06:19:22
【问题描述】:
我有一段代码曾经看起来像这样:
$deepest{$xval} = $Evalue unless exists $deepest{$xval};
#some code
foreach (keys %deepest){
print $datfh $_, "\t", $deepest{$_}, "\n";
}
然后我改成
$deepest{$xval} = [$Evalue, $id] unless exists $deepest{$xval}[0];
#some more code
foreach (keys %deepest){
print $datfh $_, "\t", $deepest{$_}[0], "\t", $deepest{$_}[1], "\n";
}
现在我得到,当我之后打印哈希时,很多警告:
Use of uninitialized value in print
这是我以前没有得到的。
为什么新的哈希结构与旧的不同?有什么办法可以避免出现未初始化的条目吗?
更新:愚蠢的我,我没有在原始问题中包含实际导致错误的代码部分。现在它进来了,现在我也知道如何摆脱它,即将exists $deepest{$xval}[0] 替换为exists $deepest{$xval},不知何故第一种方法创建了哈希条目。
【问题讨论】:
-
您可能想用
$deepest{$xval} //= [$Evalue, $id]替换长的unless语句。它完全相同,因为它会设置$deepest{$xval}的值(如果它存在但具有undef的值)以及它不存在,但那是几乎可以肯定适合您的目的 -
看来
%deepest中有一个键,它的值是一个包含一个元素的数组引用。 -
@Borodin 感谢您的提示,我会记住这一点。不过,在这段代码中,除非语句包含更多条件,但我没有提出问题,因为它们没有产生问题,所以在这种情况下,无论如何我都必须使用除非。
-
打印语句中不应该是
$deepest{$_}->[0](等等)吗?哈希值是数组references,而不是数组。 -
“不知何故”与 perl 的自动激活有关 - perlmonks.org/?node_id=691557