L'opérateur defined en Perl vérifie si une valeur est définie (si ce n'est pas undef). Il est important de faire la distinction :
defined($x) renverra vrai si $x n'est pas égal à undef (indépendamment de la valeur, même si c'est une chaîne vide ou 0).defined($hash{$key}) vérifie si la valeur d'un élément est définie, mais ne garantit pas que la clé elle-même existe.defined($array[$i]) — de même, l'élément peut être défini, mais le tableau peut être plus long ou plus court.exists.Exemple :
my %h = (a => undef); if (exists $h{a}) { print "La clé 'a' existe "; } if (defined $h{a}) { print "La clé 'a' est définie "; } else { print "La clé 'a' n'est pas définie "; }
Résultat :
La clé 'a' existe
La clé 'a' n'est pas définie
Quelle est la différence entre
exists $hash{$key}etdefined $hash{$key}et quand la vérification de defined pour un hachage donnera-t-elle un résultat inattendu ?
Réponse : defined $hash{$key} vérifie la valeur, mais si la clé n'existe pas, elle renverra une valeur indéfinie. Si la clé existe, mais que sa valeur est undef, defined renverra faux. Mais si la clé n'existe pas — ce sera également faux. Par conséquent, pour vérifier l'existence d'une clé, utilisez toujours exists.
Exemple :
my %h = (foo => undef); if (defined $h{foo}) { ... } # faux if (exists $h{foo}) { ... } # vrai
Histoire
Dans un projet, un drapeau "prêt" était vérifié comme
defined($status{$id}), et si sa valeur était undef, la tâche était considérée comme non traitée. Cependant, les clés avec undef étaient valides, et il n'y avait pas de vérification sur exists — par conséquent, certaines données traitées étaient relancées.
Histoire
Un programmeur, en important des données d'un fichier, comparait des chaînes comme ceci :
if (defined $line && $line ne ''). Problème : parfois, $line pouvait être une chaîne nulle '0'. Une telle chaîne n'est pas vide, mais la comparaison avec defined (au lieu de vérifier ne '') entraînait la perte de ces chaînes.
Histoire
Dans un grand script Perl, travaillant avec des hachages, la seule vérification de l'existence d'un élément était defined — par conséquent, pour les clés avec la valeur undef, des bogues et des données manquantes dans les rapports se sont produits.