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 :

Ajout de de valeur d'un dans un autre hash


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 195
    Points : 121
    Points
    121
    Par défaut Ajout de de valeur d'un dans un autre hash
    Bonjour,

    faisant suite à un poste précédent, je cherche à manipuler des informations récupérer dans deux hash distinct mais un plus plus "gros" (%hash) en clé et l'autre plus petit (%hash1) mais avec des clés identiques pour celles présentes.
    Je cherche à rajouter les valeurs du second hash avec celles du premier.
    Je bloque non seulement sur les commandes et aussi de savoir ce qui est le plus efficaces (ici il y a très peu de données mais c'est pour le concept en terme de performances si le nombre était beaucoup plus grand), soit rajouter les valeurs du second hash au premier avec les clés identiques ou de créer un nouveau hash.
    Un problème qui se posait est que le second hash n'a pas toutes les clés.

    Je ne montre pas de bout de code car ce que j'ai testé n'a pas du tout fonctionné.

    Merci.


    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
    my %hash = (
    '3037.a605.a243' => '10.2.199.254',
    '28d2.4441.d513' => '10.2.99.13',
    '4083.dee1.00a1' => '10.2.99.3',
    'e055.3dac.9560' => '10.2.99.1',
    '0005.3505.755c' => '10.2.99.7',
    '0025.15ba.3320' => '10.2.99.238',
    '0012.efe1.d634' => '10.2.99.237',
    '0000.5e00.015b' => '10.2.99.254',
    '3037.a605.a241' => '10.2.99.252',
    '3037.a605.a242' => '10.2.199.126',
    'a0e0.aff0.fec0' => '10.2.199.121',
    '0007.4d3c.caf6' => '10.2.99.170',
    '0c11.6780.3edc' => '10.2.199.3',
    '6c99.8984.0610' => '10.2.199.2',
    '7c2f.8082.0edb' => '10.2.199.1',
    );

    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 %hash1 = (
    '0000.5e00.015b' => 'Fa0/3',
    '0003.ea07.f0a0' => 'Fa0/21',
    '0005.3505.755c' => 'Fa0/16',
    '0012.efe1.d634' => 'Fa0/3',
    '0026.7377.5cf9' => 'Fa0/13',
    '0c11.6780.3edc' => 'Fa0/18',
    '6c99.8984.0610' => 'Fa0/19',
    'e055.3dac.9560' => 'Fa0/10',
    '0c11.6780.3edc' => 'Fa0/18',
    '6c99.8984.0610' => 'Fa0/19',
    '7c2f.8082.0edb' => 'Fa0/7',
    'a0e0.aff0.fec0' => 'Fa0/5',
    );
    Bout de résult attendu en exemple
    0000.5e00.015b => [10.2.99.254, Fa0/3],
    0012.efe1.d634 => [10.2.99.237, Fa0/3],
    3037.a605.a241 => [10.2.99.252],
    ...

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 138
    Points : 138
    Points
    138
    Par défaut
    Un petit bout de code fait rapidement avant de quitter le taf (peut sûrement être factorisé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    my %h_result;
     
    foreach my $key (keys(%hash) ) {
        $h_result{$key} = [] unless exists $h_result{$key};
        push @{$h_result{$key}}, $hash{$key};
    }
     
    foreach my $key (keys(%hash1) ) {
        $h_result{$key} = [] unless exists $h_result{$key};
        push @{$h_result{$key}}, $hash1{$key};
    }
     
    say Dumper(\%h_result);
    sortie :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    $VAR1 = {
              '3037.a605.a243' => [
                                    '10.2.199.254'
                                  ],
              '3037.a605.a242' => [
                                    '10.2.199.126'
                                  ],
              '6c99.8984.0610' => [
                                    '10.2.199.2',
                                    'Fa0/19'
                                  ],
              '3037.a605.a241' => [
                                    '10.2.99.252'
                                  ],
              '0000.5e00.015b' => [
                                    '10.2.99.254',
                                    'Fa0/3'
                                  ],
              '0007.4d3c.caf6' => [
                                    '10.2.99.170'
                                  ],
              'e055.3dac.9560' => [
                                    '10.2.99.1',
                                    'Fa0/10'
                                  ],
              '0005.3505.755c' => [
                                    '10.2.99.7',
                                    'Fa0/16'
                                  ],
              '7c2f.8082.0edb' => [
                                    '10.2.199.1',
                                    'Fa0/7'
                                  ],
              '0c11.6780.3edc' => [
                                    '10.2.199.3',
                                    'Fa0/18'
                                  ],
              '0012.efe1.d634' => [
                                    '10.2.99.237',
                                    'Fa0/3'
                                  ],
              '0026.7377.5cf9' => [
                                    'Fa0/13'
                                  ],
              '28d2.4441.d513' => [
                                    '10.2.99.13'
                                  ],
              '0025.15ba.3320' => [
                                    '10.2.99.238'
                                  ],
              '0003.ea07.f0a0' => [
                                    'Fa0/21'
                                  ],
              'a0e0.aff0.fec0' => [
                                    '10.2.199.121',
                                    'Fa0/5'
                                  ],
              '4083.dee1.00a1' => [
                                    '10.2.99.3'
                                  ]

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 195
    Points : 121
    Points
    121
    Par défaut
    Merci ptonnerre,

    le code fonctionne comme attendu

    Par contre tu peux me dire à quoi sert les lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $h_result{$key} = [] unless exists $h_result{$key};
    En les mettant en commentaire ca ne change rien au résultat?

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 138
    Points : 138
    Points
    138
    Par défaut
    Citation Envoyé par caramon _majere Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $h_result{$key} = [] unless exists $h_result{$key};
    En les mettant en commentaire ca ne change rien au résultat?
    'unless' fait que si la condition "Est-que la clé $key existe dans la table de hachage %h_result ?" est fausse, c'est à dire qu'elle n'existe pas, alors on crée cette clé avec pour valeur une référence anonyme vers un tableau, "[]".

    Effectivement, tu confirmes que ce n'est pas obligé de l'écrire, la création étant implicite, mais je l'ai toujours fait.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 195
    Points : 121
    Points
    121
    Par défaut
    Tu m'ôtes le doute donc

  6. #6
    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
    Bonjour,

    juste une petite remarque à propos de la première boucle foreach:

    Citation Envoyé par ptonnerre Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my %h_result;
     
    foreach my $key (keys(%hash) ) {
        $h_result{$key} = [] unless exists $h_result{$key};
        push @{$h_result{$key}}, $hash{$key};
    }
    # ...
    Lors du parcours du premier hachage (%hash), les clefs sont nécessairement uniques si bien qu'il n'est pas utile de vérifier si la clef existe déjà dans le hachage de résultats. Donc, on peut réécrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my %h_result;
     
    foreach my $key (keys(%hash) ) {
        $h_result{$key} = [];
        push @{$h_result{$key}}, $hash{$key};
    }
    # ...
    Du coup, on n'a pas besoin de créer un arrayref à vide puis de l'alimenter, on peut alimenter directement le hachage de résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my %h_result;
     
    foreach my $key (keys(%hash) ) {
        $h_result{$key} = [$hash{$key}];
    }
    # ...
    Ce qui peut encore se simplifier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my %h_result = map { [$_ => %hash{$_}] } keys %hash;
    # ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD11] Empêcher L'ajout d'une Valeur déjà saisie dans une Table
    Par jean20cent dans le forum WinDev
    Réponses: 4
    Dernier message: 25/07/2013, 11h03
  2. Recuperation La valeur de textBox dans un autre Form
    Par FITRI dans le forum Windows Forms
    Réponses: 2
    Dernier message: 06/02/2008, 17h16
  3. Ajouter la sélection d'une liste dans une autre
    Par AraBorLeg dans le forum IHM
    Réponses: 2
    Dernier message: 10/07/2007, 06h47
  4. Ajouter le contenu d'un fichier dans un autre
    Par persia dans le forum Langage
    Réponses: 3
    Dernier message: 12/03/2007, 09h37
  5. Réponses: 10
    Dernier message: 01/12/2006, 08h13

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