Retourner aux forums || Retourner au forum Programmation.perl

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

Posté par Ontologia (page perso, ) le 08 septembre 2006
0
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 !

> Lire le message (5 commentaires, moyenne: 2,2).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

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

Trouvé

Posté par Ontologia (page perso, ) le 08/09/2006 à 16:24. (lien). É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.

  • [^]Re: Trouvé

    Posté par duaner () le 08/09/2006 à 18:06. (lien). É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 Ontologia (page perso, ) le 08/09/2006 à 19:44. (lien). É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 ?

      • [^]Re: Trouvé

        Posté par duaner () le 08/09/2006 à 20:06. (lien). É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 Elie () le 08/09/2006 à 16:45. (lien). É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.

--
tes tournures de phrases ne vallent pas la verité de tes actes

Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.perl