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 :

Hachage de hachages : odd number of elements


Sujet :

Langage Perl

  1. #1
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut Hachage de hachages : odd number of elements
    Salut à tous,
    Dans le cadre d'une appli que je suis en train de développer, je susi tombé sur un drôle de problème, dont j'ai tenté de reproduire ici l'essence.

    Voici un exemple minimal :
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    sub new ()
    {
        my %hdhReturn;
        $hdhReturn{"lvl_1"}{'lvl_1->lvl_2'} = "Feuille";
        return %hdhReturn;
    }
     
    sub utiliseHdH(%)
    {
        my %hdh = shift;
    }
     
    ######################
    # MAIN               #
    ######################
     
    my %hdh = new();
    afficheHdH(%hdh);
    Mon problème est que j'ai un hachage de hachages et que je ne sais pas trop comment les utiliser, car apparemment le nombre d'éléments de ce hachage de hachages est impair, et au passage d'arguments ça coince. La structure de ce HdH est d'ailleurs changée par passage en argument.

    À l'exécution ça me donne :
    Citation Envoyé par Compilo Perl
    Odd number of elements in hash assignment at 03-hachages.pl line 16.
    ... la ligne 16 étant la récupération du hachage dans la méthode utiliseHdH(%).

    Si vous aviez une piste quelconque pour le passage de HdH en argument...
    Merci d'avance !

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Je pense que tu dois passer une référence à ton sous-programme.

    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
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    use Data::Dumper;
     
    sub new
    {
        my %hdhReturn;
        $hdhReturn{"lvl_1"}{'lvl_1->lvl_2'} = "Feuille";
        $hdhReturn{"lvl_1"}{'lvl_1->lvl_3'} = "Feuille";
        return %hdhReturn;
    }
     
    sub utiliseHdH
    {
        my $ref_hdh = $_[0];
        print Dumper %{$ref_hdh};
    }
     
    ######################
    # MAIN               #
    ######################
     
     
    my %hdh = new();
    utiliseHdH(\%hdh);

  3. #3
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    Ah voilà, je pense qu'effectivement des références seraient bien ; par contre, voici ce que ça me donne si je passe en argument \%hdh au lieu de %hdh :
    Reference found where even-sized list expected at 03-hachages.pl line 17.
    Normal tu penses ?

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Je ne sais pas, je n'ai pas ce problème chez moi. N'as-tu rien changé au code?
    Tu ne dois pas mettre le (%) devant sub utiliseHdH

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Voilà quelque chose de propre
    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
    #!/usr/bin/perl
    use strict;
    use Carp;
    use warnings;
     
     
    ######################
    # MAIN               #
    ######################
     
     
    my %hdh = new();
    utiliseHdH(\%hdh);
    <STDIN>;
     
    ######################
    # PROCEDURES         #
    ######################
     
    # Initialise mon hash
    sub new {
      my %hdhReturn = (
        "lvl_1" => {
          'lvl_1->lvl_2' => "Feuille",
        },
      );
     
      return %hdhReturn;
    }
     
    sub utiliseHdH {
        my ($RefHdhReturn) = @_;
     
        print "TEST : $RefHdhReturn->{lvl_1}{'lvl_1->lvl_2'}\n";
    }

  6. #6
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    Exact Jasmine ! C'était bêtement ça. Merci beaucoup, cela fonctionne dans mon exemple ; reste plus qu'à l'intégrer dans mon projet

    Merci aussi djibril, en plus je ne connaissais pas ce Carp

    Sujet résolu, bonne journée !

  7. #7
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    Je reviens à la charge !

    Cette histoire fonctionne donc parfaitement, pour les références tout fonctionne bien.

    Maintenant, mon programme mouline, et il appelle donc une bonne quantité de fois les méthodes qui créent le fameux hachage, que je prends en référence. À la fin du traitement de chaque hachage, je le laisse de côté ; il doit donc normalement être détruit par le garbage collector, non ? Et dans l'itération suivante, je crée une nouvelle référence de hachage...

    Seulement voilà : aux itérations suivantes, la référence du nouveau hachage est choisie comme par hasard... égale à celle que j'ai créée auparavant !

    Connaissez-vous un bon moyen pour forcer la création dans une nouvelle zone mémoire, ou de forcer la destruction d'un hachage de hachages ? undef $maRefHachage ne donne rien de plus de ce côté...

  8. #8
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    ou de forcer la destruction d'un hachage de hachages
    Pour détruire, je ne sais pas mais tu peux totalement vider ton tableau en utilisant %hash = ();.

  9. #9
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    Ah c'est fou : ça ne fonctionne pas.
    Avec un Data::Dumper, c'est censé m'afficher ce genre de choses :
    $VAR1 = {
    'PULL_AND_ARCHIVE' => {
    'REQIDENT' => '01',
    'CIPHER_ARCH_FUNCTION' => 'NONE',
    'LOTID' => '01',
    'AGEHOST' => 'lat203'
    }
    };
    avec un seul couple clé-valeur au niveau 1 (ici PULL_AND_ARCHIVE). Or au bout de quelques itérations, j'obtiens quelque chose dans ce goût-là :
    $VAR1 = {
    'RELOAD_QUERY' => {
    'REQIDENT' => '01',
    'CIPHER_ARCH_FUNCTION' => 'NONE',
    'LOTID' => '01',
    'AGEHOST' => 'lat203'
    },
    'LOG_OPEN' => undef,
    'SERVER_STATUS' => undef,
    'PULL_AND_ARCHIVE' => undef,
    Mince... Si vous avez des idées... Pour mémoire, pour utiliser des références comme cela j'ai été obligé d'enlever le pragma strict refs. Merci beaucoup Jasmine, en tous cas !

  10. #10
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Sincèrement, je ne comprends pas ton souci.
    Je t'ai fait un code complet, qu'est ce que tu n'arrive plus à faire?
    Peux tu nous montrer ton nouveau code?

  11. #11
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Je pense que tu devrais remettre le pragma strict et retravailler ton code.

  12. #12
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    Yourêkah !

    J'ai vu ton code complet Djibril, mais mon projet est un peu plus complexe, donc un bug se perd forcément plus facilement... En tous cas, j'ai compris ; à la fin je me disais bien qu'il devait y avoir une erreur bête, et j'ai trouvé : je ne déréférençais pas le bon objet .

    Merci à vous deux pour votre aide précieuse

  13. #13
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    ok

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/05/2009, 20h11
  2. probleme de suppression des element de la table de hachage
    Par étoile de mer dans le forum Débuter
    Réponses: 16
    Dernier message: 06/10/2008, 13h44
  3. Réponses: 6
    Dernier message: 02/01/2008, 16h18
  4. hachage de hachage et possibilité
    Par mollux dans le forum Langage
    Réponses: 1
    Dernier message: 22/02/2006, 16h51
  5. Fonction de hachage
    Par killer crok dans le forum C
    Réponses: 12
    Dernier message: 02/10/2002, 09h48

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