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 :

Probleme Hash "Odd number of elements in anonymous hash at "


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 34
    Par défaut Probleme Hash "Odd number of elements in anonymous hash at "
    Bonjour,

    voilà j'ai un petit souci avec une hash.

    J'ai un tableau @ancestors qui contient les hash des differents ancetres de mon élément courant.

    J'ai codé une fonction qui, pour chaque élément final (le plus "profond" dans la parenté), retourne une hash avec pour chaque clé (correspondant à chaque élément final), une autre hash contenant différentes valeurs et je voudrais que l'une d'elle soit @ancestors.

    Cependant, je me retrouve avec le message d'erreur "Odd number of elements in anonymous hash at...".

    Ma hash de sortie peut etre schématisée de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $funct{ $funct_name } = {
                                  data_infos   => xxxxx,
                                  nature        => xxxxx,
                                  ....
                                  ancetres     =>  @ancestors
                                  };
    Quelle peut être l'origine de ce message en sachant que chaque élément de ancestors est une Hash ?

    Merci d'avance.

    Ludovic

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Le problème vient du fait que dans ta hash il y a quelque chose qui n'est pas correct, une mauvaise paire clé/valeur.

    Par exemple j'obtiens le même message si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ancestors[0] = ({"a"=>"A", "b"=>});
    http://search.cpan.org/dist/perl/pod/perldiag.pod
    Odd number of elements in anonymous hash
    (W misc) You specified an odd number of elements to initialize a hash, which is odd, because hashes come in key/value pairs.


    Jasmine,

  3. #3
    Expert confirmé
    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
    Par défaut
    Les clés d'un hash ne peuvent être que des strings et les valeurs ne peuvent être que des scalaires, donc pas un tableau comme @ancestors. Ici @ancestors est en fait aplati et son premier élément devient la valeur associé à "ancetre", son deuxième devient la clé du troisième, etc...
    Et comme tu as de la chance, au final tu as un nombre impair d'éléments et Perl te signale donc l'erreur !

    Ce que tu veux faire c'est stocker une référence sur @ancestors, pas @ancestors lui-même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $funct{ $funct_name } = {
                                  data_infos   => xxxxx,
                                  nature        => xxxxx,
                                  ....
                                  ancetres     =>  \@ancestors
                                  };
    --
    Jedaï

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 34
    Par défaut
    D'accord,

    Merci de ces renseignements.

    Une dernière question : si je mets la référence à @ancestors, est ce que, si je mets ma Hash %funct en entrée d'un template perl, je pourrais avoir accès aux valeurs contenues dans @ancestors (valeurs qui sont des hash pour information) ?

    Si oui, comment ?

    Ludovic

  5. #5
    Expert confirmé
    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
    Par défaut
    Lis notre FAQ sur les structures de données avancées, il n'y a pas de raison que rajouter un niveau pose de problème. Quel système de Template utilises-tu ?

    --
    Jedaï

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 34
    Par défaut
    J'utilise le module Epl et GEN_FILE (pour les routines ReadTemplate, CreateCFile, CreateHFile) qui sont appelées dans un .pm

    Voici un exemple de code :
    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 $template_file = "toto.pc";
    # Get template content as a line
    my $template = GEN_FILES->ReadTemplate( $template_file);
     
    # Fill in generated file content
    my $file_content = Epl::fill(
                                       $template,
                                       {
                                        var1       => xxx,
                                        .... 
                                        function => \%function
                                      }
                                    );
     
    # Generate file
    GEN_FILES->CreateCFile( "totofile.c", $file_content);
    Avec %function défini comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $function{ $funct } = {
                                  data   => xxxx,
                                  ....
                                  ancetres => \@ancestors
                                  };
    En gros, j'ai en entrée de mon template une référence vers une hash qui contient une référence vers un tableau de hash (@ancestors).
    Comment accéder aux infos des hash du tableau au sein de mon template ?
    J'ai tout de meme une question :
    Comment récupérer la taille du tableau ancestors à partir de sa référence ?

    Merci d'avance.
    Ludovic

Discussions similaires

  1. Hash of anonymous hashes : probleme avec une key/pair
    Par AltaJup dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2012, 18h11
  2. [AC-2007] Probleme de formulaire en mode : Plusieurs elements
    Par Rapheux dans le forum IHM
    Réponses: 1
    Dernier message: 24/08/2010, 00h35
  3. Réponses: 4
    Dernier message: 28/05/2009, 20h11
  4. Hachage de hachages : odd number of elements
    Par Le Barde dans le forum Langage
    Réponses: 12
    Dernier message: 11/07/2008, 12h05

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