Vos recrutements informatiques

700 000 développeurs, chefs de projets, ingénieurs, informaticiens...

Contactez notre équipe spécialiste en recrutement

Quelle différence entre liste
Array et hash en Perl ?

Le , par ram-0000, Rédacteur
Bonjour,

Une question existentielle dont je n'arrive pas à percevoir la réponse claire.

D'après ma 1ere compréhension
  • un array (préfixé par @) est une table de 'choses' et on accède à ces 'choses' par leur index (nombre variant de 0 à n) $array[12] par exemple
  • un hash (préfixé par %) est aussi une table de 'choses' et on accède à ces 'choses' par leur clé $hash['cle'] par exemple


Par contre, j'ai un peu de mal à comprendre les listes. Qu'est ce que c'est et quelle différence par rapport à un tableau ?

Merci d'avance pour vos réponses


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de Lolo78 Lolo78 - Rédacteur/Modérateur http://www.developpez.com
le 14/02/2014 à 9:21
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:
Code : Sélectionner tout
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:
Code : Sélectionner tout
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:
Code : Sélectionner tout
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:
Code : Sélectionner tout
my ($mot2, $mot5)  = (split / /, "Le contrepèterie est l'art de décaler les sons.")[1, 4];
Avatar de ram-0000 ram-0000 - Rédacteur http://www.developpez.com
le 14/02/2014 à 10:57
OK, merci pour ta réponse, cela s'éclaircit

Cela mérite peut être une entrée dans la FAQ (pour les grands débutants) ?
Avatar de ggnore ggnore - Modérateur http://www.developpez.com
le 14/02/2014 à 11:13
Genre une liste, ça serait (keys (%data1), keys(%data2)) dans
Code : Sélectionner tout
foreach my $row (keys (%data1), keys(%data2))
?

On peut faire un tableau explicitement en faisant :
Code : Sélectionner tout
my @array = (keys(%data1), keys(%data2));
Je n'avais pas conscience de cette notion de liste qui, comme mieux dit plus haut, ne semble être qu'un tableau temporaire.
Avatar de Lolo78 Lolo78 - Rédacteur/Modérateur http://www.developpez.com
le 15/02/2014 à 0:45
Citation Envoyé par ram-0000  Voir le message
Cela mérite peut être une entrée dans la FAQ (pour les grands débutants) ?

OK, je vais vérifier qu'il n'y a rien sur le sujet et, si c'est bien le cas, préparer une nouvelle FAQ. C'est un point qui trouble souvent les débutants (je me suis moi-même fait avoir plus d'une fois quand j'ai commencé le Perl) et même parfois des personnes plus expérimentées, et c'est une distinction très importante.

Note que j'ai apporté une petite correction à ce que j'avais écrit, ainsi que des précisions complémentaires.
Avatar de djibril djibril - Responsable Perl et Outils http://www.developpez.com
le 15/02/2014 à 8:55
Tu peux préparer des QR, pas forcément une nouvelle FAQ . Et je les rajouterais dans la FAQ.
Avatar de Lolo78 Lolo78 - Rédacteur/Modérateur http://www.developpez.com
le 15/02/2014 à 10:20
Citation Envoyé par djibril  Voir le message
Tu peux préparer des QR, pas forcément une nouvelle FAQ . Et je les rajouterais dans la FAQ.

Oui, Djibril, après avoir regardé hier soir la FAQ existante, je pensais effectivement à juste une ou deux questions/réponses à ajouter à la fin de la partie de la FAQ relative aux listes. J'espère faire cela ce weekend.
Avatar de Lolo78 Lolo78 - Rédacteur/Modérateur http://www.developpez.com
le 16/02/2014 à 23:27
Citation Envoyé par ram-0000  Voir le message
Cela mérite peut être une entrée dans la FAQ (pour les grands débutants) ?

C'est fait, deux nouvelles entrées ont été ajoutées dans la partie de la FAQ relative aux listes.
Avatar de ram-0000 ram-0000 - Rédacteur http://www.developpez.com
le 17/02/2014 à 7:24
Citation Envoyé par Lolo78  Voir le message
C'est fait, deux nouvelles entrées ont été ajoutées dans la partie de la FAQ relative aux listes.

Super boulot, je ne sais pas si les 2 nouvelle entrées sont de toi ou s'il s'agit d'un travail collaboratif mais félicitations, maintenant c'est beaucoup plus clair.
Offres d'emploi IT
Expert sécurité en audit d'applications (H/F)
Société Générale - Ile de France - Val-de-Marne
Analyste SI-métier (H/F)
Société Générale - Ile de France - Val-de-Marne
Chef de projet SI confirmé (H/F)
Société Générale - Ile de France - Val-de-Fontenay

Voir plus d'offres Voir la carte des offres IT
Responsable bénévole de la rubrique Perl : djibril -