IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

2 questions simples sur les tableaux et hashs multidimensionnels


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur Systèmes
    Inscrit en
    Août 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Monaco

    Informations professionnelles :
    Activité : Ingénieur Systèmes
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 75
    Points : 87
    Points
    87
    Par défaut 2 questions simples sur les tableaux et hashs multidimensionnels
    bonjour,

    deux questions me turlupinent
    en fait la première est liée à la seconde.

    1) que se passe-t'il si je crée un tableau avec 2/3 entrées utilisant comme clefs des chiffres assez gros du genre 6786785678576576.
    les éléments de 0 à 6786785678576576 seront undef j'imagine, mais surtout, l'accès au tableau sera-t'il rapide ? et la place en mémoire sera-t'elle grosse ?
    (le fait de n'avoir que 2/3 gros records..est-ce que les elements vides entre les valeurs se remplissent ? et prennent de la place ?)

    2) j'ai besoin de mettre des données dans un tableau ou hash multidimensionnel.

    à priori, j'ai un utilisateur, qui peut avoir plusieurs types de droits. et tous ces droits sont organisés par ID.

    petit exemple :

    l'utilisateur TOTO1 peut avoir eu un accès à 3 périodes différentes, genre 20140314223744, 20132204223104 et 19991205121213.
    a chacune de ces périodes, il a eu un accès avec 4 attributs/valeurs, par exemple :
    droit : RW
    groupe : admin
    description : machinchose
    date : 20141506

    j'aimerais mettre tout ça dans un tableau/hash

    que dois-je faire ? est-ce qu'un hash de hash fonctionnera ? ou dois-je faire un hash de arrays de hash ?
    un truc du genre ?? ça marchera ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    $hoho = (
     TOTO1 => {
                  34567656758778 => {
                                       droit    => machin,
                                       groupe => truc,
                                 description => machinchose,
                                    }
                  34567657867851 => {
                                       droit    => machin,
                                       groupe => truc,
                                 description => machinchose,
                                    }
                  67868221167851 => {
                                       droit    => machin,
                                       groupe => truc,
                                 description => machinchose,
                                    }
                }
     TOTO2 => {
                  34567656758778 => {
                                       droit    => machin,
                                       groupe => truc,
                                 description => machinchose,
                                    }
                  34567657867851 => {
                                       droit    => machin,
                                       groupe => truc,
                                 description => machinchose,
                                    }
                }
    )
    ou dois-je fais un hash (users) qui contient des arrays (IDS) qui contient un hash (clefs/valeurs) ?
    et aussi comment remplir & parser ces valeurs (je pense que je saurais le remplir, mais difficilement le lire, j'ai pas bien saisi la différence entre les lectures du genre $hash{machin}{truc}{bidule} et $hash{machin}->{truc}->{bidule} (les fleches c'est pourquoi ? :p)

    je vous avouerais ne pas connaitre grand chose aux multidimensions/références..

    merci de vos lumières )

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Il suffit d'essayer. Je savais que ça n'allait pas marcher, j'ai essayé tout de même, mais je dois reconnaître que je n'ai pas eu le message d'erreur auquel je m'attendais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $ perl -e 'my @array; $array[6786785678576576] = 1;'
    Modification of non-creatable array value attempted, subscript -1383478336 at -e line 1.
    Autrement dit, je m'attendais à un dépassement de la capacité mémoire, mais il y a eu, semble-t-il, une forme de "integer overflow" avant le dépassement mémoire.

    En revanche, créer une table de hachage avec une clef de ce genre ne pose aucun problème, c'est sans doute ce que tu vas devoir faire.

    Sinon, tu as défini un hash de hash de hash de hash, et c'est sans doute la structure la plus adaptée à ce que tu veux faire, sauf que tu as quelques erreurs de syntaxe. Déjà, ton hash hoho, il a besoin du sigil %:
    Ensuite, il faut des virgules entre les différents sous-hash. Enfin, si tes clefs n'ont pas besoin de guillemets parce que l'opérateur "=>" transforme automatiquement ce qui précède en une chaîne de caractères, il faut des guillemets (ou apostrophes) pour les valeurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    my %hoho = (
     TOTO1 => {
                  34567656758778 => {
                                       droit    => "machin",
                                       groupe => "truc",
                                 description => "machinchose",
                  },
                  34567657867851 => {
                                       droit    => "machin",
                                       groupe => "truc",
                                 description => "machinchose",
                  },
    
    # ...
    Pour accéder aux données, tu peux utiliser la syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $hash{machin}->{truc}->{bidule}
    qui est la syntaxe théorique de base, destinée à expliciter le fait que les éléments du hachage %hash sont en fait des références vers les sous-hash (l'opérateur -> servant à déréférencer une référence pour accéder au contenu pointé par la référence). Mais, par mesure de simplification de la syntaxe, la documention explique que quand l'opérateur "->" se trouve entre entre deux accolades ou entre une accolade et un crochet (dans un ordre ou l'autre), il peut être omis, le compilateur comprend ce à quoi il a affaire, si bien que la syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $hash{machin}{truc}{bidule}
    est parfaitement admissible pour accéder à la même donnée, et, à mon avis, nettement plus simple et plus lisible. Quand j'ai commencé à utiliser des structures de données imbriquées de ce type, il y a une douzaine d'années, je ne connaissais encore rien ou presque aux références, mais ça ne m'a pas empêché d'utiliser ces structures utilement et efficacement dans des cas simples avec la seconde syntaxe ci-dessus. Mais à moment donné, pour aller plus loin (par exemple dès qu'il s'agit de parcourir tous les éléments du hash de hash de ...), il devient vite nécessaire de comprendre de façon plus approfondie qu'un hash de hash est en fait un hash de références vers des sous-hash.

    Le début de la partie 2 de mon tutoriel sur la programmation fonctionnelle (voir ma ligne de signature) explique (assez brièvement) comment ça marche.

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur Systèmes
    Inscrit en
    Août 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Monaco

    Informations professionnelles :
    Activité : Ingénieur Systèmes
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 75
    Points : 87
    Points
    87
    Par défaut
    merci pour ta réponse je vais tester ça

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2014
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Première question
    Salut,

    Si jamais l'attribution de trop grandes clés pose problème tu peux les réduire en les divisant par le plus grand nombre premier qui le divise et stocker celui ci dans ta mémoire pour y avoir accès. Ainsi tu multiples par ce nombre et tu as le nombre d'origine
    Ou alors tu peux créer un tableaux qui stocke un nom de tableau qui correspondra aux informations de la personne et décider que si ton nombre de départ est divisible par 7 alors il va dans le tableaux 7 ...

    Je pense que je suis pas bien clair et j'en suis désolé
    Bonne journée

  5. #5
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Autrement dit, tu crées une pseudo-fonction de hachage. Pourquoi pas, mais la fonction de hachage de Perl est sans doute nettement plus efficace. Il m'est arrivé de faire des choses comme cela dans des langages n'ayant pas de tables de hachage, mais je ne vois pas trop l'intérêt avec Perl qui gère cela très bien pour toi.

Discussions similaires

  1. [MySQL] Question simple sur les tableaux pour un initié
    Par bom8407@hotmail.com dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 01/03/2007, 12h22
  2. Réponses: 4
    Dernier message: 16/11/2006, 03h10
  3. Question basique sur les tableaux
    Par valanagrid dans le forum C++
    Réponses: 8
    Dernier message: 08/11/2006, 16h47
  4. question simple sur les select dynamiques
    Par grinder59 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 24/01/2006, 16h53
  5. Question simple sur les threads :)
    Par momox dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/06/2003, 05h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo