我使用以下代码检查散列是否为空。有没有更好的方法,这是否安全使用?
if (!keys %hash) { print "Empty";}
答案 0 :(得分:85)
if (%hash)
工作得很好。
如果在标量上下文中计算哈希值,则在哈希值时返回false 是空的。如果有任何键/值对,则返回true;更多 确切地说,返回的值是一个由数字组成的字符串 用桶和分配的桶数,用a分隔 斜线。
答案 1 :(得分:22)
有a bug导致标量上下文中的并列哈希始终返回false。该错误是fixed in 5.8.5。如果你关注的是向后兼容,那么我会坚持使用if( !keys %hash )
。否则,请按照其他人的建议使用if( !%hash )
。
答案 2 :(得分:19)
简单:
if (!%hash) {
print "Empty";
}
!强加标量上下文,并在标量上下文中计算哈希返回:
false
如果密钥为零(文档中未定义,但通过实验返回0
一个字符串,表示有多少使用/分配的桶用于> 0键,这当然不是假的(例如“3/6”)
答案 3 :(得分:1)
"更好的"是一个主观的术语。但是我认为更容易理解的代码可以被描述为“更好”和“#34;”。出于这个原因,我得出结论!keys %hash
更好,因为编写perl代码的每个人都会知道这段代码的作用和工作原理。 !%hash
至少我必须要注意以确保它是否真的有效或只是看起来会起作用。 (原因是标量上下文中散列的返回值相当混乱,而标量上下文中的数组行为是众所周知的并且经常被使用。)
此外,!keys %hash
即可保存。
所以不,没有更好或更安全的方法来检查散列是否为空。