Tableaux associatifs


Les tableaux associatifs (également connues sous le nom de tables de hashage) peuvent avoir pour indice n'importe quelle valeur scalaire : un entier, un réel ou une chaîne. Ils sont désignés par le caractère %, préposé devant leur nom à la place du @ "traditionnel". Ainsi,

$fruit{"banane"} = 1;

fait référence à un élément du tableau %fruit.

Cette notion de tableau associatif permet comme on le voit de définir par exemple le nombre de bananes, ce qui serait bien plus délicat avec des tableaux classiques.

Exemple : programme de comptage du nombre de mots commençant par une majuscule et d'affichage du nombre d'occurrences de chaque.

#!/bin/perl/
while ($inputline = <STDIN>) {
    while ($inputline =~ /\b[A-Z]\S+/g) {
        $word = $& ;
        $word =~ s/[;.,:-]$// ; # supprime la ponctuation
        $wordlist{$word} += 1;
        }
    }
    print ("Mots en capitales et nombre d'occurrences:\n");
    foreach $capword (keys(%wordlist)) {
    print ("$capword: $wordlist{$capword}\n);
}

keys est une fonction prédéfinie spéciale qui renvoie une liste composée des indices du tableau associatif.
values est une fonction prédéfinie spéciale qui renvoie une liste composée des valeurs du tableau associatif.

Attention : les éléments d'un tableau associatif sont mémorisés dans un ordre complètement aléatoire.
 

On peut créer des tableaux associatifs avec une seule affectation ; il faut faire se succéder les indices de tableau et leurs valeurs :

%fruit = ("pommes"=>17,"bananes"=>9,"orange"=>"aucune");

On peut utiliser une simple virgule à la place des séparateurs =>, mais la compréhension est moins immédiate. Ceci permet en revanche de créer un tableau associatif à partir d'une simple liste. En effet, si l'on a défini la liste

@fruit = ("pommes",17,"bananes",9,"orange","aucune");

on peut créer le même tableau associatif que précédemment avec l'instruction :

%fruit = @fruit;

Si l'on dispose de deux tableaux @a et @b, de taille identique, on peut créer un tableau associatif %tab qui à chaque élément de @a associe l'élément correspondant de @b de la manière suivante :
@tab{@a} = @b;
 

On peut supprimer un élément de tableau existant avec l'instruction delete :

delete ($fruit{"orange"});
 

On peut tester l'existence d'un élément avec la fonction exists :

%liste=(1,2,3,4);
if (exists($liste{1})) {
    print ($liste{1});
}
 

On peut exécuter des boucles à l'aide de tableaux associatifs de la manière suivante. Si l'on définit le tableau associatif

%population = ("France","60 millions","USA","280 millions");

on peut boucler à l'aide de la fonction each :

while (($pays,$nb_hab) = each(%population)) {
    instructions;
}

Les variables $pays et $nb_hab sont initialisées lors de l'appel de each.

On peut former des hash avec des clés scalaires et des variables de type tableau, en passant par les références :

$hash{key} = ['a', 'b', 'c', 'd'];

Pour accéder au deuxième élément du tableau dont la référence est la valeur associée a 'key' dans %hash:
$hash{key}->[1];
Ou bien :
$hash{key}[1];
Comme un hash ne peut stocker que des scalaires, Perl fait comme si la flèche était là ...
 

Liste chaînée

Une liste chaînée peut être construite très facilement à l'aide d'un tableau associatif. C'est une liste telle que la valeur de l'un des éléments est l'indice de l'élément suivant :

%radio = ("alpha", "bravo", "bravo","charlie","charlie","delta", ...);

C'est particulièrement utile lorsque la quantité de données à traiter n'est pas connue à l'avance mais croît au fur et à mesure de l'exécution du programme.

Structures, arbres et bases de données

Une structure telle qu'il en existe en C peut être simulée en Perl par un tableau associatif. En effet, l'instruction C :

struct {
    int field1;
    int field2;
    int field3;
} maStructure;

est équivalente aux lignes Perl suivantes :

%maStructure = ( "field1","",
"field2","",
"field3","");

Les trois éléments y sont initalisés par des chaînes vides.
Les arbres et les bases de données peuvent également être construits à l'aide de tableaux associatifs.