Amis scripteurs bonjour, Aujourd'hui je me pose la question suivante "En perl, comment déclarer automatiquement des variables provenant d'une hashtable avec clé = valeur ?" Je m'explique: j'ai un tableau de hashtable ex: my @tableau = ( { "cle1"=>"valeur1", "cle2"=>"valeur2" } , { "cle1"=>"valeur3", "cle2"=>"valeur4" } , { "cle1"=>"valeur5", "cle2"=>"valeur6" } ); je parcour ce tableau comme ceci: my $nbelement = scalar( @tableau ); for( my $i ; $i < $nbelement ; $i++){ #et là j'accède à $tableau[$i]{'cle1'} ou $tableau[$i]{'cle2'} #j'en profite pour déclarer: my $cle1 = $tableau[$i]{'cle1'}; # c'est ces 2 déclarations my $cle2 = $tableau[$i]{'cle2'}; # qui nous intéressent ici #reste du traitement } J'aimerais que ces 2 déclarations (en réalité un bonne dizaine et qui en plus ne cesse d'augmenter) soient faites automatiquement, j'aimerais faire un truc du style: my $nbelement = scalar( @tableau ); for( my $i ; $i < $nbelement ; $i++){ map( eval \$$_ = $tableau[$i]{'$_} , keys $tableau[$i] ); } mais voilà je but.... qqun aurait une idée ? Florent,
Salut Florient, 1. Merci de ne pas crossposter 2. Je n'aime pas trop l'idée de passer par eval pour remplir des variables, je pense donc que ma réponse n'est de loin pas ce qui peut se faire de plus propre (une utilisation fine du namespace et des typeglobs doit permettre qqchose de beaucoup plus élégant, je pense, mais il te faudra poster sur la liste des mongeurs de perl pour avoir une réponse satisfaisante). Ma soluc.: use strict; use warnings; my @krishna = ( { host => 'www', user => 'mc' }, { host => 'mx', user => 'bob' } ); for my $element ( @krishna ) { # mes variables my ( $host , $user ) ; # generation du code my $code; for ( keys %$element ) { $code.='$'.$_.'=$$element{'.$_.'};' } #evaluation du code eval $code; die $@ if $@; # ca marche : print "host : $host user : $user -- "; } Sachant que perso, je serais plus enclin a écrire des choses comme : for ( @krishna ) { print "user : $$_{user} host : $$_{host} -- " } bon perl, mc
participants (2)
-
Florent Guiliani
-
Marc Chantreux