web-dev-qa-db-fra.com

comment vérifier si un hachage est vide en perl

J'utilise le code suivant pour vérifier si le hachage est vide. Existe-t-il une meilleure méthode et est-ce sûr à utiliser?

if (!keys %hash) { print "Empty";} 
47
Kiran K Telukunta
if (%hash)

Fonctionnera très bien.

De perldoc perldata :

Si vous évaluez un hachage dans un contexte scalaire, il renvoie faux si le hachage est vide. S'il existe des paires clé/valeur, il renvoie vrai; plus précisément, la valeur renvoyée est une chaîne composée du nombre de compartiments utilisés et du nombre de compartiments alloués, séparés par une barre oblique.

86
TLP

Il y avait n bug qui faisait que les hachages liés dans le contexte scalaire retournaient toujours faux. Le bug était corrigé en 5.8.5 . Si vous êtes préoccupé par la rétrocompatibilité si loin, je resterais avec if( !keys %hash ). Sinon, utilisez if( !%hash ) comme recommandé par les autres.

22
Schwern

Plus simple:

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

! impose un contexte scalaire, et le hachage évalué dans un contexte scalaire renvoie:

  • false s'il n'y a aucune clé (non définie dans la documentation mais renvoie expérimentalement 0

  • Une chaîne indiquant combien de compartiments utilisés/alloués sont utilisés pour> 0 clés, ce qui ne sera bien sûr PAS faux (par exemple "3/6")

19
DVK

"Mieux" est un terme subjectif. Cependant, je dirais qu'un code plus facile à comprendre peut être décrit comme "meilleur". Pour cette raison, je conclus que !keys %hash est mieux, car tous ceux qui écrivent du code Perl sauront ce que fait ce code et qu'il fonctionne. !%hash est quelque chose au moins que je devrais rechercher pour m'assurer que cela fonctionne vraiment ou que cela semble fonctionner. (La raison étant que la valeur de retour d'un hachage dans un contexte scalaire est assez déroutante alors qu'un comportement de tableaux dans un contexte scalaire est bien connu et souvent utilisé.)

Également, !keys %hash est enregistré.

Donc non, il n'y a pas de meilleur moyen de vérifier si un hachage est vide.

2
Benjamin Krupp