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";
!
强加一个标量上下文,并且在标量上下文中评估的哈希返回:
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是不是为空的主要内容,如果未能解决你的问题,请参考以下文章