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 :

Les tableaux associatifs sont ils triés?


Sujet :

Langage Perl

  1. #1
    Membre régulier Avatar de wodel
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2005
    Messages
    295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2005
    Messages : 295
    Points : 104
    Points
    104
    Par défaut Les tableaux associatifs sont ils triés?
    Bonjour,

    j'aimerai savoir si les clefs d'un tableau associatifs suivent une logique de stockage,ie je vais utiliser un exemple ça sera plus simple:

    j'ia déclaré un tableau associatif:

    %Tab = ("admin" => "--admin=admin",
    "adminpass" => "--adminpass=pass",
    "user" => "--user=",
    "passwd" => "--passwd=");

    comme vous pouvez le remarquer, y a des chapms (cle,valeur) qui sont préts pour étre utilisés telque "admin", et d'autres qui vont étre remplis par la suite dans le script exemple "user", ce tableau va etre rempli puis ces valeurs vont étre récupérées pour devenir les paramétres d'une commande.

    lorsque j'execute ce code qui ne fait qu'afficher ce tableau:

    while (my ($cle, $value) = each (%monTab))
    {
    print "cle: $cle => val: $value\n";
    }

    je n'obtient l'ordre avec lequel j'ai créé mon tableau, ie il ne m 'affiche pas:

    cle: admin => val: --admin=admin
    cle: adminpass => val: --adminpass=pass
    cle: user => val: --user=nom.user
    cle: passwd => val: --passwd=458ght


    il m'affiche plutot:

    cle: admin => val: --admin=admin
    cle: adminpass => val: --adminpass=pass
    cle: passwd => val: --passwd=458ght
    cle: user => val: --user=nom.user



    je ne comprends pas pourquoi l'ordre change.........................


    merci d'avance

  2. #2
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    C'est parce que les tableaux associatifs en Perl sont des tableaux de hachages, ce qui signifie que les entrées sont organisées, en interne, avec un système de classement par hashcode de la clé. C'est en principe totalement transparent par l'utilisateur. C'est une chose qu'il faut bien comprendre : les hash n'ont pas d'ordre défini (du moins, rien de trivial) parce qu'ils ne sont pas censés en avoir, vu que ce sont des tableaux associatifs. Tu m'as l'air de venir du PHP, où les tableaux associatifs sont effectivement assez différents.

    Si tu veux obtenir tes entrées dans un ordre précis, il faut d'abord extraire les clés avec la fonction keys, puis les mettre dans l'ordre voulu avec sort, ou si l'ordre en question n'est pas trivial, les garder dans un tableau dans l'ordre que tu souhaites.

    Sinon, juste une remarque, en passant : tu as une raison particulière de rappeler la valeur de la clé dans tes entrées de tableau ? Ça m'intrigue.

  3. #3
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Si tu veux vraiment faire ça, tu peux aussi utiliser le module Tie::IxHash.

    --
    Jedaï

  4. #4
    Membre régulier Avatar de wodel
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2005
    Messages
    295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2005
    Messages : 295
    Points : 104
    Points
    104
    Par défaut
    Salut,

    merci pour vos réponse...........

    pour repondre a ta question Schmorgluck, j'ai une commande qui crée des comptes, et je doit lui passer pas moins de 500 utilisateurs, alors j'ai fait un ptit script perl qui lit un fichier text en entrée, chaque ligne du fichier contient toutes les informations concernnt un compte (username, pass ...etc)

    cette commande necessite un droit admin d'ou les ("admin" => "--admin=admin",
    "adminpass" => "--adminpass=pass")
    anisi que d'autres paramétres dont certains doivent respecter un ordre.

    Si tu regardes la 2eme partie du hash ie la partie valeur, elle contient la moitié de la déclaration d'un paramétre exemple --username=, et dans ma boucle j'ai un code qui ressemble a ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while(FILE)
    {
            ..........................
            $Tab{'cusername'}  =  $Tab{'cusername'}.$username;
            ...........................
    }
    c'est pour ces raisons que j'ai besoin du tri et de rappeler la valeur de la clé

  5. #5
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Non, a priori tu n'as pas compris ce qu'a dit Schmorgluck : ton stockage est redondant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    %Tab = ("admin" => "admin",
    "adminpass" => "pass",
    "user" => "",
    "passwd" => "");
    contient exactement autant d'information, mais tu viens de multiplier par 2/3 environ ta consommation mémoire.

    Par la suite tu peux retrouver tes options avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (my ($cle, $value) = each (%monTab)) {
       print "cle: $cle => val: --$cle=$value\n";
    }
    Avec Tie::IxHash pour conserver l'ordre, tu as ta solution.
    D'un autre côté, si j'ai bien compris tu as plein de hashs qui ont les même clés, non ?
    Dans ce cas il est nettement préférable question performance de stocker l'ordre des options à part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my @order_keys = qw(admin adminpass user passwd);
     
    # ...
     
    for my $key (@order_keys) {
       print "cle: $key => val: --$key=$monTab{$key}\n";
    }
    --
    Jedaï

Discussions similaires

  1. [Framework] [Core] les singleton Spring sont-ils multi thread ?
    Par mrjeronimo dans le forum Spring
    Réponses: 8
    Dernier message: 24/06/2008, 13h28
  2. Les composants graphiques sont-ils des controles ActiveX
    Par Lucas Panny dans le forum C++Builder
    Réponses: 0
    Dernier message: 02/11/2007, 06h55
  3. Pourquoi les mails ne sont ils pas envoyés?
    Par Sunsawe dans le forum Développement
    Réponses: 3
    Dernier message: 13/04/2007, 00h49
  4. Réponses: 9
    Dernier message: 13/06/2006, 22h52
  5. Les drivers ODBC sont-ils nécessairement payants ?
    Par Draekonyss dans le forum 4D
    Réponses: 5
    Dernier message: 20/04/2006, 19h50

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