ProgrammationDéveloppeur Backend Perl, Data Engineer (Perl), Fullstack Perl

Quels sont les pièges à éviter lors de l'utilisation de l'opérateur defined et comment vérifier correctement l'existence et le non-vide d'une valeur dans différents types de variables Perl ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 :

  • Pour une scalaire : 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).
  • Pour un hachage : 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.
  • Pour un tableau : defined($array[$i]) — de même, l'élément peut être défini, mais le tableau peut être plus long ou plus court.
  • Pour vérifier l'existence d'une clé dans un hachage, utilisez 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

Question piège.

Quelle est la différence entre exists $hash{$key} et defined $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

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet.


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.