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

Programmation et administration système Perl Discussion :

remplissage de table de hash ?!


Sujet :

Programmation et administration système Perl

  1. #1
    Membre à l'essai
    remplissage de table de hash ?!
    Bonjour a tous,

    Voila mon problème, sur lequel je bute depuis quelques semaines.

    Dans un script, je lis un fichier texte généré par un ldap.
    Dans le flot d'information je dois ressortir un id associé a un "grade". Une problématique apparaît avec ce fichier car l'ordre de répétition n'est pas régulier. A chaque contact apparait soit : "idnumber" & "rank" ou "rank" & "idnumber".

    Mon idée est donc de créer un table de hashage où "idnumber" devient la clé et "rank" la valeur et à partir d'une boucle while d’implémenter cette table au fur et a mesure de la lecture du fichier texte.

    par exemple :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while (my $line = <LIRE>){
    if ($line =~ m/(reg1)(reg2)/) {
    $idnumber = $2;
    } elsif ($line =~ m/(reg3)(reg4)/){
    $rank = $2;
    }else {
    say (VIDE "$line");
    }
    %ldap = ($idnumber => [$rank]);
    }


    avec ce bout de code est ce que j'ajoute une nouvel ensemble clé valeur ou est ce que j’écrase la dernière entrée.
    si ça n'ajoute pas comment faire ?

    Merci pour votre attention.

  2. #2
    Expert éminent sénior
    Bonjour

    est ce que j'ajoute une nouvel ensemble clé valeur ou est ce que j’écrase la dernière entrée.

    La ligne 9 dit que le hash ldap est maintenant un nouveau hash ne contenant qu'un couple dont la clé est $idnumber et la valeur est $rank avec des crochets (pourquoi avoir mis des crochets ? )

    si ça n'ajoute pas comment faire ?
    Le plus simplement du monde :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    $ldap{$idnumber}=$rank;

    Cette ligne veut dire : "dans le hash ldap, la valeur, dont la clé est $idnumber, est $rank".

    Est-ce ce que tu cherches ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre à l'essai
    en fait ce que je cherche a faire c'est qu'a chaque ligne lue , si les conditions sont réalisées j'ajoute de nouvelles clés/valeur et non pas remplacer celles déjà crées.
    je vais tester ta solution ...
    En tout cas merci pour ta réponse rapide

  4. #4
    Expert éminent
    Bonjour,

    Je n'ai pas tout compris:
    Est-ce qu'un idnumber peut avoir plusieurs rank ?

    Si oui, tu dois plutôt remplir un tableau pour chaque hash:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    use Data:<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />umper;
    use strict;
    use warnings;
    my $idnumber="12345";
    my $rank=987 ;
    my %ldap;
    push(@{$ldap{$idnumber}},$rank);
    $rank=123;
    push(@{$ldap{$idnumber}},$rank);
    print Dumper(\%ldap);

    A l'execution, ça donne:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $VAR1 = {
              '12345' => [
                           987,
                           123
                         ]
            };
    Cordialement.

  5. #5
    Rédacteur/Modérateur

    Citation Envoyé par Flodelarab Voir le message


    La ligne 9 dit que le hash ldap est maintenant un nouveau hash ne contenant qu'un couple dont la clé est $idnumber et la valeur est $rank avec des crochets (pourquoi avoir mis des crochets ? )
    Pas exactement "$rank avec des crochets". Les crochets sont un constructeur de référence à un tableau, si bien que la valeur dans le nouveau hachage n'est pas la variable $rank entre crochets, mais une référence à un tableau anonyme (et oui, on se demande pourquoi avoir mis ces crochets).

    Exemple sous le debugger pour visualiser la structure créée:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      DB<1> $idnumber = 42
     
      DB<2> $rank = 36
     
      DB<3> %ldap = ($idnumber => [$rank]);
     
      DB<4> x \%ldap
    0  HASH(0x3773198)
       42 => ARRAY(0x3769a78)
          0  36


    On voit bien que pour la clef 42, le hachage contient une référence à un tableau anonyme (0x3769a78) contenant ub seul élément, le nombre 36.

    A part ce point, je suis d'accord avec le reste de ta réponse.

  6. #6
    Membre à l'essai
    Merci pour l’intérêt que vous avez porté a ma question.
    effectivement il peut arriver que idnumber puisse avoir plusieurs rank (mais pas dans ce fichier) donc cette deuxième solutions m’intéresse également.
    Pour ce qui est de la faute avec les crochets, il s'agit d'une erreur de ma part en recopiant le bout de code, sur mon script il n'y en a pas

    en tout cas les solutions proposées fonctionnent et eje vous en remercie , je met le sujet en "résolu"
    Merci