60 votes

Quelle est la différence entre existe et défini?

Quelle est la différence entre

 if (defined $hash{$key}) { }
 

et

 if (exists $hash{$key}) { }
 

Quand est-ce que je sais lequel utiliser?

99voto

Michael Carman Points 21983

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:

  1. Il représente plus fidèlement l'intention (uniquement les clés sont utiles, mais pas les valeurs).
  2. Tous undef des valeurs de partager une seule affectation (ce qui économise de la mémoire).
  3. 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).

15voto

TLP Points 48922

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
 

7voto

Igor Oks Points 9737

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.

4voto

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.

3voto

weismat Points 4354

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

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.

Powered by:

X