【发布时间】:2012-03-15 17:44:34
【问题描述】:
我使用以下代码检查哈希是否为空。有没有更好的方法,使用起来安全吗?
if (!keys %hash) { print "Empty";}
【问题讨论】:
我使用以下代码检查哈希是否为空。有没有更好的方法,使用起来安全吗?
if (!keys %hash) { print "Empty";}
【问题讨论】:
if (%hash)
可以正常工作。
如果您在标量上下文中评估哈希,则如果哈希返回 false 是空的。如果有任何键/值对,则返回 true;更多的 准确地说,返回的值是一个字符串,由 使用的桶和分配的桶的数量,用 a 分隔 斜线。
【讨论】:
keys %hash慢很多。
perlop 中)。
keys %hash。
a bug 导致标量上下文中的绑定哈希始终返回 false。该错误是fixed in 5.8.5。如果您担心很久以前的向后兼容性,我会坚持使用if( !keys %hash )。否则按照其他人的建议使用if( !%hash )。
【讨论】:
scalar keys %hash == 0 作为测试。所以!keys ... 基本上是在对数组进行测试,而不是在哈希上。
keys %hash 返回一个数组。 scalar keys %hash 返回一个整数。请注意,Perl 函数是上下文感知的并且可以优化。 !%hash 已优化为返回布尔值。它不会遍历它的键,它已经有一个计数。代码是一场噩梦,但here's the optimization。 i = HvUSEDKEYS(hv);
更简单:
if (!%hash) {
print "Empty";
}
! 强加一个标量上下文,并且在标量上下文中评估的哈希返回:
0)根据 Perl 的版本,以下任一种:
一个字符串,表示有多少个已使用/分配的存储桶用于 >0 个键,这当然不会是假的(例如“3/6”)。 (非空字符串评估为 true)
散列中的键数(如perldata 中所述:“从 Perl 5.25 开始,返回值已更改为
哈希。如果您需要访问旧行为,您可以使用
"Hash::Util::bucket_ratio()" 代替。")
【讨论】:
"false",这将是一个真值。它返回零。
“更好”是一个主观术语。但是我认为更容易理解的代码可以被描述为“更好”。出于这个原因,我得出结论!keys %hash 更好,因为每个编写 perl 代码的人都会知道这段代码的作用和工作原理。 !%hash 至少我必须查一下以确保它是否真的有效或只是看起来有效。 (原因是标量上下文中哈希的返回值相当混乱,而标量上下文中的数组行为是众所周知且经常使用的。)
另外,!keys %hash 是安全的。
所以不,没有更好或更安全的方法来检查哈希是否为空。
【讨论】:
if (%hash) 可能有效,但我试图找到语义规范。可能令人困惑的部分是if (@array) 似乎定义更明确,但为了对称性,它应该也适用于哈希。也许这就是他们最近改变它的原因。