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.
Perl | exists() Function The exists() function in Perl is used to check whether an element in an given array or hash exists or not. This function returns 1 if the desired element is present in the given array or hash else returns 0.
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.
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.
Simpler:
if (!%hash) {
print "Empty";
}
!
imposes a scalar context, and hash evaluated in a scalar context 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.")
"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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With