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 :

Problème avec un hash


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 44
    Points : 22
    Points
    22
    Par défaut Problème avec un hash
    Bonjour, bonjour,
    Je n'ai pas vu de sujet semblable au mien. Voici toute l'histoire.

    Je récupère des éléments dans un tableau, par exemple :
    data1 0x1000
    data2 0x2000
    data3 (data2 - data5)
    data4 (data2 - data1)
    data5 (data4 - data1)
    data6 0x3000

    J'ai créé un hash associé à une regexp qui récupére tous les data avec une valeur hexa.
    donc dans mon hash, il y a :
    data1 0x1000
    data2 0x2000
    data6 0x3000

    Par contre, comment récupérer les valeurs pour calculer les data4 et data5? puis les mettre dans le hash.
    Comment faire attendre data3 (puisqu'il a besoin de data5 qui est calculé par la suite)?
    Les noms "data" sont pour expliquer, en réalité, ils portent des noms différents.

    Merci

  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
    Je pense que la meilleure solution est d'entrer les données telles quelles dans ton hash, puis de les traîter une fois que tout est entré, avec un prétraîtement qui va développer les calculs. Ça donnerait donc, dans un premier temps, un hash qu'on peut représenter sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (
      data1 => "0x1000",
      data2 => "0x2000",
      data3 => "(data2 - data5)",
      data4 => "(data2 - data1)",
      data5 => "(data4 - data1)",
      data6 => "0x3000"
    )
    C'est pour le prétraîtement que ça va être délicat, car je ne vois guère d'autre solution que de traîter récursivement ton hash de façon à ce que, chaque fois qu'une clé datan (reconnue par la regex /data\d+/) apparaît dedans, elle soit remplacée par la valeur contenue dans le hash à cette clé. Bon, je réalise que cette récursion peut être applatie sans grande difficulté.
    L'idée étant d'obtenir à terme le résultat suivant pour ton hash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (
      data1 => "0x1000",
      data2 => "0x2000",
      data3 => "(0x2000 - ((0x2000 - 0x1000) - 0x1000)",
      data4 => "(0x2000 - 0x1000)",
      data5 => "((0x2000 - 0x1000) - 0x1000)",
      data6 => "0x3000"
    )
    Après, il suffira d'utiliser eval pour finir le boulot (on pourrait aussi le faire au fur et à mesure).
    J'ai quelques pistes en tête pour parvenir à ce résultat, mais je vais te laisser gamberger un peu sur la base des indices que je t'ai donnés. Cherche un peu, et reviens poser des questions si tu bloques encore.
    There's nothing like $HOME!

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 44
    Points : 22
    Points
    22
    Par défaut
    Salut, merci pour ta réponse.
    Ca avance...
    Les données sont donc stockées dans un tableau.

    *Première étape : j'utilise un regexp qui regarde si j'ai un mot (à savoir la data dont on cherche la valeur) puis un espace et une valeur hexa.
    Les données qui ont une valeur sont entrées dans un hash.
    Les données qui n'ont pas de valeurs en hexa sont alors stockées dans un second tableau.

    *Deuxième étape : j'utilise encore un regexp sur le 2e tableau. Je regarde si j'ai le mot (data dont on cherche la valeur), les espaces et je regarde si les mots suivants que je trouve sont définis (associés au hash).
    Et je boucle.

    Qu'en penses tu?

  4. #4
    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
    Tu te compliques un peu la vie, je trouve : en mettant directement tes données dans un hash, y compris celles qui font références à d'autres données (comme dans le premier hash que j'ai représenté plus haut), tu pourrais les traîter sans plus de difficultés, et t'épargner l'étape de création de tableau.
    There's nothing like $HOME!

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 44
    Points : 22
    Points
    22
    Par défaut
    Salute,
    C'est bon mon problème est résolu
    En tout cas, merci pour les conseils Schmorgluck.
    bye

  6. #6
    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
    Mouarf, j'espérais qu'on pourrait en discuter un peu plus, parce que ton problème était intéressant dans ses développements possibles. J'y ai pas mal réfléchi ces derniers jours à mes moments perdus, et je suis tombé sur deux failles de sécurités potentielles dans les solutions les plus simples.

    J'espère que la solution que tu as trouvée saura échapper aux écueils suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    data7 data8
    data8 data7
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data7 un_code_dangereux
    There's nothing like $HOME!

  7. #7
    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
    AVERTISSEMENT TRÈS IMPORTANT

    Le dernier exemple de ligne problématique que j'ai donné, si vous n'êtes pas certain du résultat, NE TESTEZ PAS VOTRE PROGRAMME AVEC, même "juste pour voir". Remplacez-le par cette ligne si vous voulez faire des tests :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data7 print "hahaha, je t'ai eu!\n"
    Ça vous montrera si votre code est raisonnablement sécurisé, sans causer de dégâts. Il était irresponsable de ma part de proposer un code aussi dangereux comme exemple à vérifier pour d'éventuels débutants. Je présente mes plus humbles excuses à la communauté pour ce fait. En fait, je vais de ce pas retirer ce code dangereux de mon exemple précédent (qu'est-ce que j'avais donc en tête à ce moment là ?).

    Une règle très importante à assimiler pour toute utilisation d'eval, c'est que si ce que cette commande doit évaluer a ou peut avoir été généré par une source extérieure au programme lui-même, directement ou indirectement, N'UTILISEZ PAS eval, utilisez le module Safe à la place, avec les restrictions que vous jugerez necessaires.

    J'irais même jusqu'à dire qu'il ne faut jamais utiliser la commande eval (à ne pas confondre avec le bloc eval, qui lui ne présente pas plus de danger que la moyenne), uniquement le module Safe, sauf si vous êtes vraiment sûr de ce que vous faites.
    There's nothing like $HOME!

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

Discussions similaires

  1. Problème avec un HASH
    Par Quantactique dans le forum Langage
    Réponses: 9
    Dernier message: 16/05/2012, 16h12
  2. Problème avec un hash de tableau de hash
    Par hy00ga dans le forum Langage
    Réponses: 1
    Dernier message: 21/10/2011, 15h10
  3. [MySQL] problème avec la récupération de données hashées avec l'algorythme md5 dans ma BD
    Par roy-mustang dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 07/07/2011, 08h21
  4. Safari problème avec hash et position fixed
    Par Bill_Bob dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 16/05/2011, 17h30
  5. Problème avec un hash
    Par SkyBioSS dans le forum Langage
    Réponses: 2
    Dernier message: 14/03/2008, 19h55

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