how to check if a hash is empty in perl

PerlHash

Perl Problem Overview


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";} 

Perl Solutions


Solution 1 - Perl

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.

Solution 2 - Perl

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.

Solution 3 - Perl

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)

Depending on the version of Perl, either of the following:

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

  • The number of keys in the hash (as explained in perldata: "As of Perl 5.25 the return was changed to be the count of keys in the hash. If you need access to the old behavior you can use "Hash::Util::bucket_ratio()" instead.")

Solution 4 - Perl

"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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKiran K TelukuntaView Question on Stackoverflow
Solution 1 - PerlTLPView Answer on Stackoverflow
Solution 2 - PerlSchwernView Answer on Stackoverflow
Solution 3 - PerlDVKView Answer on Stackoverflow
Solution 4 - PerlA PersonView Answer on Stackoverflow