如何在perl中检查哈希是否为空

时间:2012-02-25 14:36:51

标签: perl hash

我使用以下代码检查散列是否为空。有没有更好的方法,这是否安全使用?

if (!keys %hash) { print "Empty";} 

4 个答案:

答案 0 :(得分:85)

if (%hash)

工作得很好。

来自perldoc perldata

  

如果在标量上下文中计算哈希值,则在哈希值时返回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即可保存。

所以不,没有更好或更安全的方法来检查散列是否为空。