Rien à redire à ta distinction entre tableau (ou array) et une table de hachage (hash). Une liste est une collection de choses n'ayant pas de nom et n'ayant pas non plus d'adresse mémoire utilisable. Une liste est donc par essence éphémère puisqu'elle n'est pas stockée sous la forme d'une variable. Une liste est aussi par essence non mutable (elle ne peut pas être une lvalue). A part cela, il y a peu de différence entre une liste et un tableau et un bon nombre des fonctions (sort, map, grep, etc.) sont utilisables de la même manière sur des listes et des tableaux. Mais les fonctions qui modifient un tableau ne sont généralement pas utilisables ssur une liste, sauf éventuellement à créer une autre liste.
Evalué dans un contexte scalaire, un tableau retourne le nombre d'éléments du tableau alors qu'une liste retourne le dernier élément de la liste.
Correction, mise à jour et précisions complémentaires: j'avais indiqué par erreur que la fonction shift pouvait être utilisée sur une liste, mais ce n'est pas le cas (ne serait-ce que parce que la fonction shift modifie le tableau en retirant le premier élément, et une liste n'est pas modifiable, les fonctions pop et splice ne sont pas utilisables sur une liste pour la même raison). (Ma seule excuse pour cette erreur est que j'ai écrit la réponse ci-dessus dans le train pour aller bosser, sans documentation à ma disposition ni moyen de tester.) En revanche, il est possible de récupérer le premier élément d'une liste avec une syntaxe ressemblant à celle utilisée avec un tableau:
my $c = (2, 3, 4)[0]; #c vaut maintenant 2
Cette possibilité peut être très utile. Par exemple la fonction split divise une chaîne de caractère en une liste de sous-chaînes (en utilisant le premier argument comme séparateur). Souvent on affecte la liste de sous-chaînes produite à un tableau:
my @mots = split / /, "Le contrepèterie est l'art de décaler les sons.";
Le split génère une liste de huit sous-chaînes que l'on affecte ensuite au tableau @mots. Il arrive toutefois assez souvent, dans ce genre de split, que l'on ait besoin de seulement une ou deux des sous-chaînes générées par le split. On peut alors faire ceci:
my ($mot2, $mot5) = @mots[1, 4]; # le "sigil" à employer ici est bien @ (et non $) parce que l'on récupère non pas un scalaire, mais une collection de deux scalaires
Mais on peut aussi le faire directement en une seule instruction plus concise:
my ($mot2, $mot5) = (split / /, "Le contrepèterie est l'art de décaler les sons.")[1, 4];
Partager