Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Quelle différence entre liste, array et hash ?


Sujet :

Langage Perl

  1. #1
    Rédacteur

    Quelle différence entre liste, array et hash ?
    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
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  2. #2
    Rédacteur/Modérateur

    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 -Visualiser dans une fenêtre à part
    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 -Visualiser dans une fenêtre à part
    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 -Visualiser dans une fenêtre à part
    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 -Visualiser dans une fenêtre à part
    my ($mot2, $mot5)  = (split / /, "Le contrepèterie est l'art de décaler les sons.")[1, 4];

  3. #3
    Rédacteur

    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) ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Modérateur

    Genre une liste, ça serait (keys (%data1), keys(%data2)) dans
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    foreach my $row (keys (%data1), keys(%data2))

    ?

    On peut faire un tableau explicitement en faisant :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    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.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  5. #5
    Rédacteur/Modérateur

    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.

  6. #6
    Responsable Perl et Outils

    Tu peux préparer des QR, pas forcément une nouvelle FAQ . Et je les rajouterais dans la FAQ.

  7. #7
    Rédacteur/Modérateur

    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.

  8. #8
    Rédacteur/Modérateur

    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.

  9. #9
    Rédacteur

    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.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .