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

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

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

【问题讨论】:

    标签: perl hash


    【解决方案1】:
    if (%hash)
    

    可以正常工作。

    来自perldoc perldata

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

    【讨论】:

    【解决方案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 optimizationi = 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) 似乎定义更明确,但为了对称性,它应该也适用于哈希。也许这就是他们最近改变它的原因。
    猜你喜欢
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    相关资源
    最近更新 更多