Forum Programmation.perl Récupérer les hash dans une liste de hash

Posté par  (site web personnel) .
Étiquettes : aucune
0
8
sept.
2006
Bonjour, j'ai créé une liste de hash, et en bon débutant en perl que je suis, j'ai appliqué bêtement la doc (merci les mongueurs) que j'ai trouvé. Ca donne ça :

my $refvar;
my %var;

foreach $refvar (@TabVars) {
my %h2 = %$refvar;
print "$h2{Valeur} : $h2{Type}\n";
}


@TabVars étant le tableau dont chaque case contient un hash (avec à chaque fois les mêmes clé valeur.
(J'aimerai éviter de faire une table de hash de table de hash, cette structure est claire).

Le problème est qu'il ne m'affiche rien. Cette structure est-elle correcte ?

Si oui, serait-ce le code affectant cette liste qui serait faux ?

%structvar = {"Type" => renvoiType($typinfo),
"Valeur" => $valeur};
push(@TabVars,%structvar);


Merci !
  • # Trouvé

    Posté par  (site web personnel) . Évalué à 2.

    Ce sera donc pour la gloire de google ou son sucesseur.

    En fait, c'était mon affectation qui n'était pas bonne(mal appliqué la doc).

    Il fallait faire :


    $tmp =renvoiType($typinfo);

    $structvar{Type} = $tmp;
    $structvar{Valeur} =$valeur;


    Le foreach est donc valide, je pensais au départ que c'était ça.

    « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker

    • [^] # Re: Trouvé

      Posté par  . Évalué à 3.


      %structvar = {"Type" => renvoiType($typinfo),
      "Valeur" => $valeur};

      push(@TabVars,%structvar);


      Ceci est une horreur, ca "marche" mais ce que tu fais exactement est :

      - Créer un hash structvar, avec un seul element donc la clé est une référence vers un hash anonyme, stringifiée, et la valeur est indéfinie, donc concrement:

      $structvar{'HASH(0x12345678)'} = undef

      - Rajouter ce hash à un tableau, ce qui fait que ton @TabVars contient maintenant : ('HASH(0x12345678)', undef).

      Une référence est une valeur scalaire, donc il faut l'utiliser dans le bon contexte:

      $structvar = { .... };
      push(@TabVars, $structvar);

      foreach my $ref (@TabVars) {...}

      Je ne suis pas sur de la doc sur laquelle tu t'as basé, mais utilise plutot:
      perldoc perlref
      perldoc perlreftut
      perldoc perldsc
      perldoc perllol

      Tout y est, sans erreur :)
      • [^] # Re: Trouvé

        Posté par  (site web personnel) . Évalué à 2.

        Merci, je vais étudier ça... Je me suis basé sur l'introduction à perl disponible sur le site des mongueurs de perl.
        Les man perl* sont quasiment illisible, c'est l'horreur pour trouver une information exploitable, comme pour quasiment tous les man d'ailleurs...

        $structvar = { .... };
        Comment ça peut être un scalaire puisque c'est une hashtable ? Il devait y avir erreur de typage non ?

        « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker

        • [^] # Re: Trouvé

          Posté par  . Évalué à 3.

          {...} est une reference vers un hashtable anonyme, tu peux voir ca juste comme une adresse qui dit ou trouver la table en question, c'est donc cette adresse qu'il faut stocker.

          Un hash s'initialiser au moyen d'une liste, tu verras d'ailleurs dans la doc que => est un synonyme pour "," (a une difference pret). Donc:

          %hash = (a => 1, b => 2) -> BIEN
          %hash = ('a', 1, 'b', 2) -> BIEN
          $hash = {a => 1, b => 2} -> BIEN
          %hash = { a => 1, b => 2} -> BAD!EVIL!NOCOOKIE!

          Voila
  • # tableau de hash

    Posté par  . Évalué à 1.

    Tu as un moyen plus simple de céer un tableau de hash c'est celui-ci:

    my @tab = (
    { "un"=>"test1", "deux"=>"test2"},
    { "un"=>"2test1", "deux"=>"2test2" },

    # juste a titre d'exemple ici on mets un tableau
    ["une valeur", "une deuxieme", "une troisieme"],
    );



    print $tab[0]{un}."\n";

    affiche: "test1"

    print $tab[2][2]."\n";

    affiche "une troisieme".

    Maintenant dans ton cas precis, ca fait trop longtemp que j'ai plus fais joujou avec les references et deferencement en PERL, pour voir ou le bat blésse.

    Allez tous vous faire spéculer.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.