SELFHTML

Hashes (variables)

Page d'information: vue d'ensemble

vers le bas Déclarer les Hashes et affecter des valeurs
vers le bas Accéder à différentes clés et valeurs
vers le bas Fonctions et opérations pour manipuler les Hashes

 vers le bas 

Déclarer les Hashes et affecter des valeurs

Les Autre page d'information listes habituelles ou tableaux sont constituées d'une série de valeurs adressables par des numéros d'index commençant à 0. Le 8ème élément d'une liste nommée @liste_noms sera donc adressable par $liste_noms[7]. Une liste associative, désignée en Perl par "Hash", sauvegarde par contre deux valeurs par élément de liste: un nom et une valeur. Les valeurs dans un Hash n'ont pas besoin de numéros d'index pour être adressés: elles sont "associées" au nom correspondant. Le nom est désigné pour cette raison en tant que "clé". Par cette clé, il est possible d'accéder aux données ainsi reliées.

Exemple d'un script CGI complet:

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

my %donnees = ("Nom","Jeanne","age",23,"ville","Marseille");
my %meilleures_donnees = (Nom => "Jeanne", age => 23, ville => "Marseille");

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Sortie du test</title>\n";
print "</head><body>\n";

print "<pre>",%donnees,"</pre>\n";
print "<pre>",%meilleures_donnees,"</pre>\n";

print "</body></html>\n";

Explication:

Dans l'exemple sont déclarés deux Hashes nommés %donnees et %meilleures_donnees. La "déclaration" signifie la même chose pour les Hashes que pour les Autre page d'information Arrays. Un Hash est introduit par le signe pourcentage %. Derrière suit le nom du Hash. Pour la déclaration d'un hash, vous pouvez attribuer des valeurs de départ ou non. Dans les deux exemples ci-dessus sont affectées des valeurs de départ. ici, il y a deux notations différentes, dont celle qui est appliquées pour %meilleures_donnees est la plus claire et donc celle qui est recommandée. Soit vous notez les valeurs comme montré dans le premier Hash. Là tout est noté comme dans une liste avec des virgules pour séparer. Le premier, troisième, cinquième etc... élément désignent toutefois un nom, et le deuxième, quatrième, sixième etc... élément la valeur correspondante. Dans la notation recommandée, ceci apparaît plus clairement. Là les paires de nom et valeur sont séparées par l'opérateur indicatif => (souvent désigné comme 'fat comma' ), et les virgules ne sont notées qu'entre les paires. Pour la notation avec l'opérateur => (qui représente un synonyme pour la virgule, ce pourquoi il est aussi désigné comme fat comma) les guillemets pour les noms, donc les clés, peuvent être omis, s'ils satisfont aux Autre page d'information règles pour l'attribution de noms. Pour l'autre notation avec séparation avec des virgules entre la clé et la valeur, les guillemets par contre s'imposent même pour les clés. Les deux exemples de Hashes montrent cette différence.

Comme pour les scalaires et les listes, vous pouvez déclarer des hashes vides. Une instruction telle que my %donnees; déclare un hash qui est toutefois tout d'abord vide.

Comme les listes, les hashes ne peuvent aussi contenir pour les différentes valeurs que des scalaires, donc des chaînes de caractères et des nombres que vous pouvez ici également mêler à souhait. Dans l'exemple ci-dessus les valeurs distinctes Jeanne et Marseille sont des chaînes de caractères, tandis que 23 est un nombre.

Le script en exemple envoie du code HTML au navigateur appelant et sort simplement le contenu des deux hashes.

Attention:

Les scalaires, les listes et les hashes ont des espaces de nommage différents. Des variables comme $nom, @nom et %nom peuvent donc cohabiter sans problème dans le même script.

Des hashes complets, donc qui commencent avec le signe pourcentage, ne sont pas interprétés quand ils sont placés entre guillemets dans les instructions print. Pour sortir complètement un hash comme dans l'exemple ci-dessus, vous devez utiliser la technique de sortir plusieurs valeurs distinctes avec print , valeurs séparées par des virgules, comme dans l'exemple ci-dessus.

À la place de données constantes, vous pouvez également insérer d'autres variables dans un hash. Par exemple :
my $age = 23;
my %donnees = (Name => "Jeanne", age => $age);

Les hashes peuvent être employés très judicieusement avec les scripts CGI. Il est ainsi possible par exemple, . Par exemple, le flux de données d'un formulaire HTML rempli par un utilisateur peut être lu directement dans un hash en sauvegardant comme nom-clé du hash à chaque fois le nom de champ d'un élément de formulaire du fichier HTML, et comme valeur, celle que l'utilisateur a entrée ou choisie pour l'élément considéré.

 vers le hautvers le bas 

Accéder à différentes clés et valeurs

Exactement comme pour les listes, vous accédez à une scalaire quand vous lisez les différentes valeurs sauvegardées d'un hash ou affectez des valeurs. Pour l'accès, utilisez la clé.

Exemple d'un script CGI complet:

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

my %donnees = (Nom => "Jeanne", age => 23, ville => "Marseille", formation => "Bachot");

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Sortie du test</title>\n";
print "</head><body>\n";

print "$donnees{'Nom'} a $donnees{'age'} ans, habite à $donnees{'ville'} et a son  $donnees{'formation'}\n";

print "</body></html>\n";

Explication:

Dans le script le hash %donnees est à nouveau déclaré et initialisé avec quatre valeurs (cette fois tout de suite dans la meilleure notation). Le script envoie du code HTML au navigateur appelant et sort les données. Cette fois ci cependant, il est accédé aux différentes valeurs du hash %donnees. Avec $donnees{'Nom'} il est accédé à l'élément du hash qui a pour clé Nom. Vous n'avez pas besoin de connaître la place de l'élément dans le hash. Il suffit de mentionner la clé. Grâce à elle il sera accédé à la valeur correspondante. $donnees{'Nom'} accède donc dans l'exemple à la valeur Jeanne. Il est important que la clé soit placée dans des parenthèses accolades. Les parenthèses font partie dans ce contexte (à l'intérieur de chaînes de caractères) du nom de variable et doivent être notées derrière le nom du hash (aucun espace permis).

La syntaxe comme dans $donnees{'Nom'} montre avec le signe dollar qui précède, qu'il s'agit bien d'une scalaire pour une valeur du hash.

Attention:

À la place d'une notation comme $donnees{'Nom'} vous pouvez également noter $donnees{Name}, donc sans apostrophes. Dans la mesure où rien d'autre qu'une clé distincte ne figure dans les parenthèses, et qu'elle satisfait aux Autre page d'information règles pour l'attribution de noms, les apostrophes peuvent être omises.

 vers le hautvers le bas 

Fonctions et opérations pour manipuler les Hashes

Beaucoup de fonctions Perl, s'appliquent aux Autre page d'information Listes et Hashes, quelques unes d'entre elles seulement aux Hashes, étant donné que la manipulation de hashes présente quelques particularités. Quelques possibilités importantes doivent être nommées ici avec des liens à la description de la fonction concernée.

Travailler avec des clés inconnues:
Quand vous initialisez un hash avec des valeurs, vous connaissez également les noms de clé. Mais quand vous lisez les données - par exemple des données de formulaire HTML dans un script CGI - alors il est fréquent que vous ne sachiez pas tout ce qui se trouve dans le hash qui a enregistré les données. Pour avoir d'abord un récapitulatif des clés qui ont été lues dans le hash, vous pouvez utiliser la fonction Autre page d'information keys. Ensuite vous aurez une Autre page d'information liste avec tous les noms ou clés du hash. Supposons que vous ayez un hash %donnees avec des clés et valeurs qui vous sont tout d'abord inconnues. Alors vous pouvez avec une instruction telle que @clefs = keys(%donnees); rechercher les clés. Vous pouvez ensuite accéder par exemple par $donnees{$clefs[0]} à la valeur du hash qui est associée au nom qui peut être trouvé maintenant trouvé dans $clefs[0] sans connaître explicitement la clé.

Modifier ou ajouter des valeurs:
Par une instruction comme $donnees{prenom} = "Olivier"; vous affectez à l'intérieur du hash %donnees une valeur à l'élément avec la clé prenom. Au cas où une clé prenom existe déjà dans le hash, la valeur qui y était sauvegardée jusqu'alors est remplacée par la nouvelle valeur affectée. Si par contre, la clé n'existe pas encore, la paire clé-valeur sera simplement ajoutée au hash. Modifier se fait donc en affectant une valeur à une clé existante, et ajouter en affectant une valeur à une clé qui n'existe pas encore.

Effacer la paire clé-valeur:
Pour effacer une paire clé-valeur complète, Perl dispose de la fonction Autre page d'information delete .

Traiter et trier les valeurs du hash dans l'ordre:
En interne, les hashes sont sauvegardés dans une structure de données, qui assure l'efficacité lors des accès en écriture et en lecture. En raison de cet état de faits l'ordre est la clé comme il a été livré par exemple par la fonction Autre page d'information keys, (apparemment) plus ou moins aléatoire et ne correspond que très rarement avec l'ordre dans lequel vous avez déclaré le hash. Vous n'avez aucune possibilité de modifier cet ordre. Rien ne vous empêche par contre, de parcourir les éléments du hash dans un certain ordre par exemple avec une boucle. Ainsi vous pouvez par exemple avec @tri_clefs = sort keys %donnees trier alphabétiquement les clés du hash %donnees et affecter cette liste triée de clés au tableau @tri_clefs. Vous pouvez enfin utiliser une telle liste triée des clés (avec une boucle par exemple) pour traiter les différents éléments du hash dans cet ordre alphabétique qui vient d'être obtenu. Ici vous avez le choix entre le tri d'après les clés ou d'après les valeurs. Pour cela vous devez appliquer de toutes façons quelques fonctions Perl telles que une boucle. Dans la partie sur les boucles, vous trouverez une description sur le thème Autre page d'information Boucles pour les hashes.

Rechercher le nombre de paires clé-valeur d'un hash:
Vous pouvez également résoudre ceci par la fonction Autre page d'information keys. Avec une instruction telle que $nombre = keys(%donnees); vous sauvegardez dans la scalaire $nombre le nombre de clés existantes dans %donnees, ce qui donne le nombre de paires clé-valeur. Car la fonction keys retourne, quand elle est appelée dans un contexte scalaire le nombre des clés.

 vers le haut
page suivante Autre page d'information Références ou pointeurs (Variables)
page précédente Autre page d'information Listes ou Arrays (Variables)
 

© 2001 Stefan Münz / © 2003 Traduction Adresse électronique Serge François, 13405@free.fr
Adresse électronique selfhtml@fr.selfhtml.org