(Se reporter à la section perldata du manuel Perl.)
Perl manipule quatre types de variables:
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
$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."
.
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
(Se reporter à la section perlfunc du manuel Perl.)
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')
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
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.
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).
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
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
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'