2012-02-25 38 views
44

我使用下面的代码来检查哈希是否为空。有没有更好的方法,这是安全的使用?如何检查一个哈希是否为空perl

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

如果您觉得您的问题已得到解答,请点击左侧的复选标记以接受答案。 – TLP 2012-02-26 00:07:50

回答

77
if (%hash) 

会工作得很好。

perldoc perldata

如果你评估在标量上下文的哈希,它如果哈希 是空的返回false。如果有任何键/值对,则返回true;更确切地说,返回的值是一个字符串,包含 用过的桶的数量和分配的桶的数量,用 斜线分隔。

+2

它似乎比'keys%hash'慢得多。 – choroba 2013-09-25 21:37:54

17

简单:

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

!强加了标量上下文,和散列在一个标量上下文中计算的返回:

  • false是否存在零个键(在文档中没有定义,但是实验返回0

  • 的字符串标志着多少用过的/分配桶用于> 0键,这当然将是不假(例如,“3/6”)

+0

不,它不会返回'“false”',这将是一个真正的价值。它返回零。 – Borodin 2012-02-25 14:55:25

+0

@Borodin - 错误的引号。固定 – DVK 2012-02-25 15:06:56

20

a bug造成绑散列在标量上下文总是返回false。该错误是fixed in 5.8.5。如果你担心向后兼容性,我会坚持使用if(!keys %hash)。否则按照其他人的建议使用if(!%hash)

1

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

另外,!keys %hash是保存。

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