perl中如何判断一个hash是不是为空

Posted

技术标签:

【中文标题】perl中如何判断一个hash是不是为空【英文标题】:how to check if a hash is empty in perlperl中如何判断一个hash是否为空 【发布时间】:2012-03-15 17:44:34 【问题描述】:

我使用以下代码检查哈希是否为空。有没有更好的方法,使用起来安全吗?

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

【问题讨论】:

【参考方案1】:
if (%hash)

可以正常工作。

来自perldoc perldata:

如果您在标量上下文中评估哈希,则如果哈希返回 false 是空的。如果有任何键/值对,则返回 true;更多的 准确地说,返回的值是一个字符串,由 使用的桶和分配的桶的数量,用 a 分隔 斜线。

【讨论】:

好像比keys %hash慢很多。 好答案:我缺少的是定义语义的参考(不在perlop 中)。 @choroba 你也有它的解释和数字(Perl 版本)吗? @U.Windl:它最近发生了变化,所以在当前的 Perl 版本中,标量上下文中的 %hash 等价于keys %hash 似乎!%h was optimized some more in 5.26。 scalar keys performance was improved in 5.28.【参考方案2】:

a bug 导致标量上下文中的绑定哈希始终返回 false。该错误是fixed in 5.8.5。如果您担心很久以前的向后兼容性,我会坚持使用if( !keys %hash )。否则按照其他人的建议使用if( !%hash )

【讨论】:

由于偏执,我使用scalar keys %hash == 0 作为测试。所以!keys ... 基本上是在对数组进行测试,而不是在哈希上。 @U.Windl 是的,keys %hash 返回一个数组。 scalar keys %hash 返回一个整数。请注意,Perl 函数是上下文感知的并且可以优化。 !%hash 已优化为返回布尔值。它不会遍历它的键,它已经有一个计数。代码是一场噩梦,但here's the optimization。 i = HvUSEDKEYS(hv);【参考方案3】:

更简单:

if (!%hash)  
    print "Empty";
 

! 强加一个标量上下文,并且在标量上下文中评估的哈希返回:

false 如果键为零(文档中未定义,但实验返回 0

根据 Perl 的版本,以下任一种:

一个字符串,表示有多少个已使用/分配的存储桶用于 >0 个键,这当然不会是假的(例如“3/6”)。 (非空字符串评估为 true

散列中的键数(如perldata 中所述:“从 Perl 5.25 开始,返回值已更改为 哈希。如果您需要访问旧行为,您可以使用 "Hash::Util::bucket_ratio()" 代替。")

【讨论】:

不,它不会返回 "false",这将是一个真值。它返回零。【参考方案4】:

“更好”是一个主观术语。但是我认为更容易理解的代码可以被描述为“更好”。出于这个原因,我得出结论!keys %hash 更好,因为每个编写 perl 代码的人都会知道这段代码的作用和工作原理。 !%hash 至少我必须查一下以确保它是否真的有效或只是看起来有效。 (原因是标量上下文中哈希的返回值相当混乱,而标量上下文中的数组行为是众所周知且经常使用的。)

另外,!keys %hash 是安全的。

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

【讨论】:

我同意:虽然认为if (%hash) 可能有效,但我试图找到语义规范。可能令人困惑的部分是if (@array) 似乎定义更明确,但为了对称性,它应该也适用于哈希。也许这就是他们最近改变它的原因。

以上是关于perl中如何判断一个hash是不是为空的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 中表示集合?

Perl如何检查数组是不是仍然为空?

如何判断一个变量在 Perl 中是不是有数值?

freemarker中判断对象是不是为空

如何判断一个集合是不是为空?

lua中判断首字符为空