如何检查一个散列在Perl中是否为空

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

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

将工作得很好。

来自perldoc perldata :

如果您在标量上下文中计算散列值,则散列值为空时返回false。 如果有任何键/值对,则返回true; 更确切地说,返回的值是一个string,由使用的桶数和分配的桶数组成,用斜杠分隔。

有一个错误导致标量环境中的哈希值总是返回false。 该错误在5.8.5中修复 。 如果你担心向后兼容性,我会坚持if( !keys %hash ) 。 否则,按照其他人的build议使用if( !%hash )

更简单:

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

! 施加标量上下文,并且在标量上下文中评估哈希返回:

  • 如果零键(在文档中没有定义,但实验返回0则为false

  • 一个string,表示有多less使用/分配的桶被用于> 0键,当然这不会是错误的(例如“3/6”)

“更好”是一个主观的术语。 不过,我认为那些比较容易理解的代码可以被描述为“更好”。 由于这个原因,我得出这样的结论!keys %hash是更好的,因为每个人写Perl代码将知道这个代码是什么,它的工作原理。 !%hash是至less我不得不查找,以确保它是否真的起作用或只看起来像它会工作。 (原因是标量上下文中的散列的返回值相当混乱,而标量上下文中的数组行为是众所周知的并且经常使用)。

另外, !keys %hash是保存的。

所以不,没有更好或更省钱的方法来检查一个散列是否为空。