# Programmation Perl/Fonctions sur listes
## Rappels sur les listes

Une liste est une suite de mots, de nombres… tout scalaire à vrai dire. Une liste stockée forme un tableau ou un tableau associatif (que nous verrons plus loin).

### une liste

Pour créer une liste on utilise les parenthèses de cette manière :
Nous avons là une suite de scalaires : "5.0", "truc", 7 et la valeur stockée dans la variable scalaire $autre_valeur.

### créer un tableau

Pour pouvoir la manipuler plus tard dans le programme, nous la stockons dans une variable. La variable est donc un tableau signalé par le sigil @.
Exemple avec parenthèses :
Mais il y a d'autres opérateurs dédiés à la création de listes, comme qw qui crée une liste de mots (quoted words). Cet opérateur est préféré aux parenthèses dû à sa concision.
Exemple avec qw :
La création de la liste est plus concise. Mais ceci va plus loin encore (voir la création de tableaux associatifs avec qw).

### Créer un tableau associatif

Un tableau associatif (ou table de hachage) est une structure permettant d'associer à un scalaire un autre scalaire. C'est une liste un peu plus complexe qu'un tableau et le sigil est différent (%).
La création de ce type de liste se fait également avec des parenthèses, mais on ajoute également (facultatif) un opérateur => pour voir facilement la clé et sa valeur :
À savoir : l'opérateur => force l'interprétation de la variable à sa gauche comme une chaîne de caractères, donc les guillemets sont inutiles. Même exemple, mais avec qw :
Là encore nous voyons la concision apportée par cet opérateur. %bon_a_manger a le sigil % donc Perl sait qu'il doit ranger les mots par paires de la manière clé-valeur ("fruit" => "cerise", "légume" => "patate").

## Fonctions de manipulation de listes

Il existe un nombre assez conséquent de fonctions de manipulation de listes (tableaux, tableaux associatifs). Nous allons aborder les plus courantes. Il n'est pas obligatoire de les connaître toutes par cœur.

### .. : créer une suite d'éléments

On pourrait vouloir par exemple créer des suites longues d'éléments qui s'enchaînent. Par exemple, avec l'opérateur .. écrire une suite de 1 à 100 n'est pas plus compliqué que :
Nous pouvons faire également la même chose avec des lettres :

#### exemple : les lettres de 'a' à 'zz'

Nous allons afficher à l'écran toutes les combinaisons des lettres de 'a' à 'zz' :

### join : concatène tous les éléments d'une liste

La commande join permet de concaténer tous les éléments d'une liste avec un motif (une chaîne de caractères par exemple) entre chaque élément.
Exemple : afficher tous les éléments d'un tableau séparés par un double point.
Affichera : « poire : cerise : pomme : fraise ».

### map : transforme tous les éléments d'une liste

Conseil : pour comprendre correctement cette fonction, voyez au moins le cours sur les fonctions et les procédures.
Cette fonction applique une transformation à tous les éléments d'un tableau ou d'une table de hachage. map prend en argument un bloc de code à exécuter et une liste (ou tableau). Il retourne une liste d'éléments modifiés.
Un exemple simple, on va doubler les valeurs d'un tableau :
Comme plus haut mais en une seule ligne :
Écrire du code aussi compact est très pratique à l'usage, mais pour un débutant il n'est pas nécessaire de savoir écrire de façon aussi concise.

### grep : récupère une partie des éléments d'une liste

Se manipule comme map, et permet de récupérer une liste d'éléments contenus dans une liste suivant certaines conditions. Exemple : les éléments numériques inférieurs à 10 :

### exists : savoir si un élément d'une liste existe

Cette fonction permet de savoir si un élément d'une liste existe. Attention : ceci ne permet pas de savoir si l'élément est défini.

### keys : retourne toutes les clés d'une table de hachage

Renvoie une liste des clés d'une table de hachage.
Affiche : « légume : fruit ».

### values : retourne toutes les valeurs d'une table de hachage

Renvoie une liste des valeurs contenues dans une table de hachage.

### each : retourne un couple clé-valeur d'une table de hachage

Cette fonction est très utile pour boucler sur tous les éléments d'un tableau associatif.
Affichera : « Un couple 'clé - valeur' : légume - carotte » .

### pop : retire le dernier élément d'une liste et le retourne

Permet de supprimer le dernier élément d'une liste. Il retourne cet élément, donc on peut le récupérer.

### push : ajoute à la fin de la liste un nouvel élément

Cette fonction ajoute un élément à la fin d'une liste.
On reprend l'exemple plus haut en ajoutant push pour remettre « fraise » :

### shift : supprime le premier élément d'une liste et le retourne

Il suffit de faire shift @tableau, exemple :

### unshift : ajoute un élément au début d'une liste

Exemple simple d'utilisation de unshift :

### reverse : inverse tous les éléments d'une liste (le dernier devient premier, etc.)

On fait simplement reverse @tableau.
Le tri alphabétique inverse en devient on ne peut plus clair.

### scalar : retourne le nombre d'éléments d'une liste

Cette fonction n'a aucune utilité si on est en contexte scalaire, par exemple :
Cependant, lorsque nous sommes en contexte de liste, il sera déjà plus utile :
Ici, le code que nous avons créé permet de créer un tableau @nombres_elements qui contient le nombre d'éléments de deux précédents tableaux. Sans scalar, nous aurions un tableau contenant l'ensemble des scalaires des deux premiers tableaux. Cela est dû à l'aplatissement des tableaux.