Guide de programmation Perl
Existence et suppression d’une clef
À la lecture de ce qui précède, il peut sembler impossible de savoir si un élément d’une table de hachage existe ou non. Rassurez-vous, les auteurs de Perl ont tout prévu 🙂 L’opérateur exists renvoie vrai si l’élément de table de hachage qu’on lui donne en paramètre existe ; sinon il renvoie faux. Par exemple :
if( exists( $h{hello} ) ) { print « La clef ‘hello’ existe\n »; }
Il est important de noter qu’un test effectué au moyen de l’opérateur defined aurait été possible, mais dangereux. En effet, l’expression defined($h{hello}) est fausse dans deux cas très différents : soit si l’élément n’existe pas, soit si l’élément existe et vaut undef ; elle sera vraie si l’élément existe et ne vaut pas undef. Il est donc impossible de distinguer le cas d’un élément absent et celui d’un élément indéfini (valant undef) avec defined.
Cette distinction entre absent et indéfini peut paraître artificielle dans ce cas (elle peut tout de même être importante dans certaines situations !), mais dans le cas de la suppression d’une clef, il en est tout autrement.
Pour supprimer une clef dans une table de hachage, il faut utiliser l’opérateur delete. L’instruction
delete( $h{hello} );
supprime la clef hello de la table %h si elle existe (si elle n’existe pas, elle ne fait rien). De la même façon que exists est la bonne méthode pour tester l’existence d’un élément, delete est la bonne méthode pour en supprimer un. Le débutant pourrait être tenté d’écrire :
$h{hello} = undef; # attention!
Ce qui est fort différent car, dans ce cas, la clef hello aura une valeur indéfinie, mais existera toujours ! On la retrouvera, par exemple, dans les parcours effectués au moyen des opérateurs keys, values ou each ; ce qui n’est sans doute pas le but recherché.
Pour résumer, on peut dire que pour tester l’existence d’une clef, il faut utiliser exists et que pour en supprimer une, il faut utiliser delete.
En marge de ces deux fonctions, voici une manière de savoir si une table de hachage est vide ou non (on qualifie de vide une table de hachage qui ne comporte aucune clef). Cette syntaxe utilise la table de hachage en contexte de chaîne de caractères, par exemple de cette façon :
if( %h eq 0 ) { print « %h est vide\n »; }
La valeur d’un hachage en contexte scalaire n’a pas d’autre utilisation que celle-ci. En effet, scalar(%A) renvoie une valeur du type 4/8 qui indique le nombre de places (buckets en anglais) utilisées par rapport au nombre total disponibles dans le hachage. Une table vide est un cas particulier, elle renverra 0.
Tables de hachage et listes
On peut facilement passer d’une liste (ou tableau) à une table de hachage et inversement. Voyez, par exemple, le petit programme suivant :
my @t = (« Paul », « 01.23.45.67.89 », « Virginie », « 06.06.06.06.06 », « Pierre », « heu… »); my %h = @t;
La première instruction crée un tableau @t initialisé à une liste à 6 éléments. La seconde crée une table de hachage %h initialisée au moyen du précédent tableau. Les valeurs du tableau sont prises deux à deux : la première de chaque couple sera la clef dans la table de hachage, la seconde la valeur. Si le nombre d’éléments de la liste est impair, la dernière clef créée aura undef pour valeur. Si une clef venait à être présente plusieurs fois dans la liste, c’est la dernière valeur qui sera prise en compte dans la table de hachage.
On aurait aussi pu écrire :
my %h = (« Paul », « 01.23.45.67.89 », « Virginie », « 06.06.06.06.06 », « Pierre », « heu… »);
Il est à noter que cette syntaxe rappelle étrangement l’un des premiers exemples de création de table de hachage qui utilisait => pour séparer clefs et valeurs. Cette similarité est en fait une quasi-équivalence , car l’opérateur => peut être utilisé à la place de la virgule pour créer des listes ; il n’a été ajouté au langage Perl que pour faciliter la lecture des affectations de tables de hachage, car il force un contexte de chaîne à sa gauche, ce qui permet justement d’écrire
%a = ( toto => ‘titi’ );
La conversion dans l’autre sens est aussi possible. L’évaluation d’une table de hachage dans un contexte de liste renvoie une liste des clefs et des valeurs, se suivant respectivement deux à deux, dans un ordre quelconque entre couples. La table de hachage %h de l’exemple précédent peut être affectée à un tableau :
my @t2 = %h;
Le tableau @t2 sera initialisé, par exemple, avec la liste suivante : (« Pierre », »heu… », »Paul », »01.23.45.67.89″, »Virginie », »06.06.06.06.06″) ; chaque clef précède sa valeur, mais l’ordre des couples (clef,valeur) est quelconque (un peu comme pour la fonction each).