Next Previous Contents

2. Les types de variables de PERL

2.1 Introduction

(Se reporter à la section perldata du manuel Perl.)

Perl manipule quatre types de variables:

  1. les variables scalaires,
  2. les tableaux,
  3. les tables de hash,
  4. les références.

2.2 La variable scalaire

Description

C'est la variable de base. La variable scalaire se préfixe du $ (comme les variables shell). Elle peut prendre pour valeur un entier, une chaîne de caractères ou une référence.

Remarque: dans un code Perl, le caractère # permet de commenter tout ce qui suit jusqu'au retour chariot.


        $number = 1;              # un entier
        $string = "Il fait beau"; # une chaine de caractères
        $reference = \$number;    # une référence sur l'entier 1

Exemples d'opérations sur les variables scalaires


        $i = "1";       # la chaine "1"
        $i ++           # 2
        $i = "$i"       # la chaine "2"

Perl effectue les conversions implicites des valeurs des variables scalaires pour que les opérations qui les affectent puissent être exécutées.


        $phrase = "2*2 = 4" . "et sqrt(4) = 2" . ".\n"; # concatenation 1

Le caractère . permet de concaténer des chaînes entre elles.


        $phrase = "2*2 = ", 2*2, " et sqrt(4) = ", sqrt (4), ".\n"; # concatenation 2

La virgule permet de concaténer les évaluations des routines présentes sur la ligne d'affectation. Ainsi la variable scalaire $phrase contient la chaine "2+2 = 4 et sqrt(4) = 2.".

2.3 La table ou liste

Description

Préfixé du caractère @, le tableau appelé aussi table ou liste est un ensemble de variables scalaires. Donc une table peut contenir des entiers, des chaînes de caractères, des références et même des tables. Pour définir une table on utilise les parenthèses et on sépare les éléments par une virgule.


        (a, b, c)               # une table de caractères
        @tab = ( 1, 2, 3)       # une table d'entiers
        @foo = ( 1, b, $var)    # une table avec des éléments de
                                # types différents

Une table est indexée par des entiers. Le premier indice d'une table est 0. Le premier élément de la table @tab se nomme $tab[0]. Le dernier élément de la table est $#tab. Le nombre d'éléments de la table peut donc s'écrire $#tab + 1


        @tab = (a, b, c);
        $tab[0];                # a
        $tab[1];                # b
        $#tab;                  # 2
        $tab[ $#tab ]           # c
        $#tab + 1               # 3

Les fonctions utilisant les tables

(Se reporter à la section perlfunc du manuel Perl.)

push, pop, shift, unshift

Ces fonctions permettent de manipuler la table comme une pile. La fonction pop retourne le dernier élément de la table et le supprime. push ajoute un élément à la fin d'une table. shift retourne le premier élément d'une table et le supprime. unshift insere un élément au début d'une table.

Voici quelques exemples d'utilisation de ces fonctions.


        @tab = ('Larry', 'WALL');
        $age = '24';
        push(@tab, $age);       # @tab = ('Larry', 'WALL', '24')
        
        print shift(@tab);      # affiche 'Larry' et
                                # @tab = ('WALL', '24')

        print pop(@tab);        # affiche '24' et
                                # @tab = ('WALL')

sort, reverse, split, join

La commande sort trie les éléments d'une table et retourne la liste triée.


        @tab = ('b', 'w', 'a', 't');
        @tab = sort @tab;               # @tab = ('a', 'b', 't', 'w')

La commande reverse retourne la liste des éléments dans l'ordre inversé.


        @tab = reverse @tab;            # @tab = ('w', 't', 'b', 'a')

split permet de découper une chaîne de caractères. C'est une fonction puissante car c'est l'utilisateur qui spécifie quel caractère ou quelle expression régulière (voir chapitre sur les expressions régulières) permet de délimiter les éléments à découper. La commande retourne une liste contenant les éléments de la chaîne découpée.


        @tab = split(/\+/, "1 + 2 + 3");        # @tab vaut (1, 2, 3)

Ici le caractère de séparation est +. Si on avait voulu découper une chaîne contenant des + et des - on aurait utilisé l'expression régulière suivante : /+|-/ qui veut dire "+ ou -".

join regroupe les éléments d'une table dans une chaîne de caractères en les séparant par la chaîne de caractères donnée en argument. La chaîne de caractères peut être annotée comme une expression régulière ou entre guillements.


        print join(/ - /, @tab);        # affiche '1 - 2 - 3';
        print join(" - ", @tab);        # idem

2.4 La table de hash

Introduction

Une fonction de hash permet de calculer une clé (unique si possible) à partir d'une chaîne de caractères. La clé de valeur entière permet d'indexer une table par la suite. Cette technique est appelée Hash coding. Son avantage est qu'elle diminue considérablement le nombre de tentatives lors d'une recherche dans une table.

Une table de hash est une liste dont chaque élément est un couple de la forme (nom, valeur). nom est une chaîne de caractères (ex: "123", "coucou", etc...) dont Perl extrait (par une fonction de hash) une clé. Cette fonction est invisible pour le programmeur.

Donc à l'indice correspondant à la clé de nom on trouve l'élément valeur. Une table de hash est en général utilisée pour construire une structure de données. Dorénavant, et par abus de langage, je dirais que nom est la clé.

Remarque: awk (gawk) fournit également ce mécanisme.

Description

La forme générale d'une table de hash est:


        %hash = ( cle1, val1, cle2, val2, ..., cleN, valN);

        %hash = (nom, WALL, prenom, Larry);

L'exemple montre une table avec deux éléments. La valeur associée à la clé prenom est Larry. De même la valeur associée à la clé nom est WALL.

Cette notation est maintenant obsolète et peu lisible. Une nouvelle écriture permet de ne pas confondre la table de hash avec une liste.


        %hash = (
                'nom' => 'Larry',
                'prenom' => 'WALL',
                );

        $hash{'nom'}    # Larry
        $hash{nom}      # Larry
        $hash{prenom}   # WALL

On remarque que lorsque la clé est constituée d'un seul mot il n'est pas nécessaire de la mettre entre apostrophes (ou quotes).

Fonctions usuelles

Les exemples des fonctions que nous allons décrire seront basés sur la table de hash suivante:


        %hash = (
                'nom' => 'FORCIOLI',
                'prenom' => 'Alain',
                'age' => '24',
                );

keys, values

keys retourne une liste (table) contenant les clés de la table de hash.


        @k = keys %hash;        # @k = ('nom', 'prenom', 'age')

Remarque: les clés sont des valeurs entières. Supposons que Alain et Bob soient deux noms dont les clés sont 30 et 20. On s'aperçoit que l'ordonnancement croissant des clés (20 puis 30) ne correspond pas à l'ordonnancement alphabétique des noms (Alain puis Bob). Aussi nous supposerons que la liste (nom, prenom, age) est la liste des noms (clés) retournée par keys.

Sachant que keys retourne une liste, il est facile de l'avoir de manière ordonnée avec la fonction sort.


        @k = sort keys %hash;   # @k = ('age', 'nom', 'prenom')

values à l'inverse de keys retourne une liste de toutes les valeurs des clés. L'obtention d'une telle liste ordonnée se fait de cette manière.


        @v = sort values %hash; # @v = ('24', 'Alain', 'FORCIOLI')

each, delete, exists

each retourne le premier couple de la table de hash sous la forme d'une liste. Le couple est ensuite supprimé de la table de hash.


        ($nom, $val) = each %hash;      # $nom = 'nom'
                                        # $val = 'FORCIOLI'
                                        # keys %hash = ('prenom', 'age')

delete supprime la valeur associée à la clé donnée en argument.


        delete $hash{'age'};    # keys %hash = ('prenom')

exists retourne 1 (vrai) si une valeur existe pour une clé donnée.


        print "Exists\n" if exists $hash{'prenom'};     # affiche
                                                        # 'Exists\n'


Next Previous Contents