Quelle est la différence entre
if (defined $hash{$key}) { }
et
if (exists $hash{$key}) { }
Quand est-ce que je sais lequel utiliser?
Quelle est la différence entre
if (defined $hash{$key}) { }
et
if (exists $hash{$key}) { }
Quand est-ce que je sais lequel utiliser?
C'est bien documenté dans la perldoc entrées pour defined
et exists
. Voici un résumé rapide:
defined $hash{key}
vous indique si oui ou non la valeur de la clé donnée est défini (c'est à dire pas undef
). L'utiliser pour distinguer entre les valeurs indéfinies et les valeurs qui sont faux dans un contexte booléen comme 0
et ''
.
exists $hash{key}
vous indique si oui ou non %hash
contient la clé donnée. L'utiliser pour distinguer entre les valeurs indéfinies et inexistant ceux.
C'est le plus facile à voir avec un exemple. Compte tenu de ce hash:
my %hash = (a => 1, b => 0, c => undef);
Voici les résultats pour la recherche, définies-ness, et de l'existence:
# key value defined exists
a 1 1 1
b 0 1 1
c undef 0 1
d undef 0 0
Dans la pratique, les gens écrivent souvent juste if ($hash{key}) {...}
parce que (dans beaucoup de cas) uniquement les vraies valeurs sont significatives/possible. Si les fausses valeurs sont valides, vous devez ajouter defined()
pour le test. exists()
est utilisé beaucoup moins souvent. Le cas le plus fréquent est sans doute lors de l'utilisation d'un algorithme de hachage comme un ensemble. par exemple
my %set = map { $_ => undef } 'a' .. 'z';
À l'aide de undef
pour l'ensemble des valeurs de a quelques avantages:
undef
des valeurs de partager une seule affectation (ce qui économise de la mémoire).exists()
tests sont légèrement plus vite (parce que Perl n'a pas à récupérer la valeur, de déterminer qu'il y en a un).Il a aussi l'inconvénient que vous devez utiliser exists()
pour vérifier l'appartenance, qui nécessite le plus de taper et faire la mauvaise chose si vous l'oubliez.
Un autre endroit où exists
est utile de la sonde verrouillé hachages avant de tenter de récupérer une valeur (qui pourrait déclencher une exception).
defined
vérifie la valeur de la variable, exists
vérifie si elle a déjà été déclarée / initialisée. S'il existe, c'est simple.
Par exemple:
$hash{$key} = undef;
# various return values:
exists $hash{$key}; # true
defined $hash{$key}; # false
$hash{$key}; # false
$hash{$key} = 0;
# various return values:
exists $hash{$key}; # true
defined $hash{$key}; # true
$hash{$key}; # false
exists $hash{$foo}; # false
Documentation Perl:
Lorsqu'il est utilisé sur un élément de hachage, défini vous indique si la valeur est définie et non si la clé existe dans le hachage. L'utilisation existe pour ce dernier but.
Comme indiqué dans le perldoc sur exists
:
Donné une expression qui désigne un élément d'une table de hachage, retourne true si l'élément spécifié dans la table de hachage a jamais été initialisé, même si la valeur correspondante est pas défini.
Un dièse ou un élément de tableau peut être vraie que si elle est définie et uniquement si elle existe, mais l'inverse n'est pas forcément vrai.
C'est, une table de hachage peut contenir un élément indéfini, et si c'est le cas, l' defined
-vérifier reviendra false
, alors que l' exists
-vérifier reviendra true
.
Par conséquent, vous devez utiliser exists
si vous souhaitez savoir si une entrée existe dans la table de hachage, et defined
si vous souhaitez savoir si l'entrée existe et est défini.
Cet exemple montre la différence. En général, les travaux définis pour toute structure et existent sont liés à des hachages.
my %hash=("1"=>undef);
print "exists:".exists($hash{"1"})."\n";
print "defined:".defined($hash{"1"})."\n";
La différence est petite et pas si évidente, alors attendez-vous à ce que les gens s'en foutent.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.