how to check if a hash is empty in perl

前端 未结 4 446
孤城傲影
孤城傲影 2020-12-16 08:57

I use the following code to check if the hash is empty. Is there a better method and is this safe to use?

if (!keys %hash) { print \"Empty\";} 
相关标签:
4条回答
  • 2020-12-16 09:41

    There was a bug which caused tied hashes in scalar context to always return false. The bug was fixed in 5.8.5. If you're concerned with backwards compatibility that far back I would stick with if( !keys %hash ). Otherwise use if( !%hash ) as recommended by others.

    0 讨论(0)
  • 2020-12-16 09:41

    Simpler:

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

    ! imposes a scalar context, and hash evaluated in a scalar context returns:

    • false if there are zero keys (not defined in the documentation but experimentally returns 0)

    • A string signifying how many used/allocated buckets are used for >0 keys, which will of course be NOT false (e.g. "3/6")

    0 讨论(0)
  • 2020-12-16 09:43

    "Better" is a subjective term. However I would argue that code that is easier to understand can be described as "better". For this reason I conclude that !keys %hash is better, because everybody writing perl code will know what this code does and that it works. !%hash is something at least I would have to look up to ensure if it really works or only looks like it would work. (The reason being that the return value of a hash in scalar context is rather confusing while an arrays behavior in scalar context is well known and often used.)

    Also, !keys %hash is safe.

    So no, there is no better or safer way to check if a hash is empty.

    0 讨论(0)
  • 2020-12-16 09:47
    if (%hash)
    

    Will work just fine.

    From perldoc perldata:

    If you evaluate a hash in scalar context, it returns false if the hash is empty. If there are any key/value pairs, it returns true; more precisely, the value returned is a string consisting of the number of used buckets and the number of allocated buckets, separated by a slash.

    0 讨论(0)
提交回复
热议问题