Forum Programmation.perl Modification de variables "dynamiques"

Posté par  (site web personnel) .
Étiquettes : aucune
0
9
fév.
2006
hello,

je suis bien conscient que mon titre ne veut pas dire grand chose, je vais mieux expliquer.

Mon code (simplifie) ressemble a ca:


my $variable;
my $v = "variable";

eval "\$$v = 42";

print "$variable\n"; #je voudrais avoir 42


En gros, j'ai une variable qui a un certain nom ($variable), une autre qui contient le nom de la premiere variable ('variable') et je veux pouvoir utiliser $variable a partir de son nom simplement, donc partir de $v.

C'est donc la ligne eval qui est mauvaise, mais un epluchage de la doc et de nombreux essais infructueux ne m'ont rien donne.
Ma question est donc double:
- est ce moi qui n'ai rien compris a eval, et il est impossible de faire ce que je veux faire
- si c'est possible, ou est mon erreur?

Merci a ceux qui pourront m'eclairer
  • # RE : Programmation.perl : Modification de variables "dynamiques"

    Posté par  . Évalué à 1.

    Chez moi ça marche ? quelle version de perl utilises-tu (perl -v). Avec perl 5 de toutes façons, pour faire ce genre de trucs, il est préférable d'utiliser des références, qui ressemblent un peu aux pointeurs du C/C++.
    my $variable = 21;
    my $ref = \$variable;
    $$ref = 42;
    print "$variable\n"; #je voudrais avoir 42
    
    • [^] # Re: RE : Programmation.perl : Modification de variables "dynamiques"

      Posté par  . Évalué à 2.

      non , les references, ca n'a rien a voir. Il veut faire du data-driven.


      BTW : ca marche aussi chez moi (perl v5.005 et v5.8.x). Tu as du melanger les programmes ...
      • [^] # Re: RE : Programmation.perl : Modification de variables "dynamiques"

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

        Effectivement, c'est bien du data-driven (meme si je ne connaissais pas le terme).

        Et effectivement ca marche aussi chez moi...
        hum.
        J'imagine qu'en simplifiant j'ai du supprimer une erreur qui etait dans le script initial, et j'avoue ne pas avoir essaye la version que j'ai poste ici...

        En tout cas merci a vous deux, je vais pouvoir continuer l'esprit tranquille.
      • [^] # Re: RE : Programmation.perl : Modification de variables "dynamiques"

        Posté par  . Évalué à 1.

        Pourrais-tu nous expliquer ce qu'est le data-driven, et ce que ça apporte par rapport à des bons vieux hash et des références ?

        @+
        • [^] # Re: RE : Programmation.perl : Modification de variables "dynamiques"

          Posté par  . Évalué à 3.

          Ce sont les donnees qui decident de ce qui est fait.

          Une petite recherche sur google t'expliquera mieux que moi.

          Un exemple simple : soit une page web avec des champs (des forms) et des boutons . les boutons sont des actions, et les champs des operations
          ( par exemple plusieurs lignes avec chacune un champs de texte + 2 bouton "modifier" "suprimer" )

          au niveau du cgi on recupere leur valeur :
          $operation=$query->param('Operation');
          $action = $query->param('Action');

          ensuite on concatene les chaines :
          $func = $action.'_'.$operation;

          il ne reste plus qu'a appeler la fonction correspondante :
          eval { &$func($query); };

          par exemple :
          sub modifier_password
          {
          ...
          }

          c'est un cas tres limité mais cela permet de rendre le code bien plus lisible
          • [^] # Re: RE : Programmation.perl : Modification de variables "dynamiques"

            Posté par  . Évalué à 2.

            Je suis désolé, mon langage de base est le C, et j'ai beaucoup de mal avec ces variables dynamiques, l'introspection, tout ça. Merci pour tes explications. Je suis désolé, mais permets-moi de te dire que ça ne me plaît pas du tout ...
            1. parce que si tu veux chercher avec ton éditeur de texte ou modify_password est appelé, tu ne le trouveras jamais. Donc ça va pas faciliter la maintenance ...
            2. parce que en faisant ça tu fais confiance aux données venant du client. Là, le client peut forcer l'exécution de n'importe quelle fonction dans ton code (en utilisant LWP par exemple) s'il met $operation à 'hack' et $action à 'me', par exemple, il va appeler la fonction hack_me, et à mon avis c'est la dernière chose que tu souhaites,
            alors que si tu fais un hash :
            my %actions = 
            {
                'modify_password' => \&modify_password, 
                 ....
            }
            
            Tu évites ces deux problèmes ...

Suivre le flux des commentaires

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