Forum Programmation.perl Substitution de variables

Posté par  .
Étiquettes : aucune
0
29
août
2007
Bonjour à tous,

Je suis en train d'adapter des scripts shell UNIX en scripts PERL sous windows.

Mon problème est le suivant :

On me fournit un fichier de configuration (déclaration de variables) qui était sourcé dans les scripts shells.
Les variables déclarées dedans peuvent être de la forme VAR2=$HOME/toto/titi
La présence d'une variable au sein même de la déclaration de VAR2 ne pose donc aucun souci.

Mes ennuis arrivent lorsque je veux utiliser ce même fichier de configuration dans mes scripts PERL sous windows. En effet, ne pouvant sourcer directement le fichier, je suis obligé de le parser.
Je me retrouve donc avec une variable PERL : $VAR2 = "$HOME/toto/titi"

En partant du principe que je me sois débrouillé à obtenir une variable PERL $HOME contenant la bonne valeur, connaissez-vous un moyen de demander à PERL de réinterpréter le contenu de $VAR2 afin d'y remplacer $HOME par sa valeur ?

Merci d'avance pour vos avis !
  • # Eval

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

    La fonction que tu cherche est eval.

    Attention, elle évalue une expression perl, donc cela veut dire que la personne qui peut écrire dans le fichier de configuration peut faire tout ce qu'il veut. Selon la situation, cela peut être une faille de sécurité.

    Pour ne pas l'utiliser, il te faudra maintenir un tableau de hash des variables utilisables et appliquer des expressions régulières sur tes définitions.
    • [^] # Re: Eval

      Posté par  . Évalué à 1.

      J'avais déjà essayé d'utiliser eval, mais je ne vois pas du tout comment résoudre mon problème avec...
      • [^] # Re: Eval

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


        my $HOME="/home";

        my $test='$VAR2="$HOME/toto/titi"';
        eval $test;

        print $VAR2."\n";


        Ce qui affiche: /home/toto/titi
        • [^] # Re: Eval

          Posté par  . Évalué à 1.

          sauf que dans ce cas là, le eval n'est pas utile
          ----------------------------
          johann@5620-3024:~$ vi test.pl

          #!/usr/bin/perl -w

          my $HOME="/home";

          my $VAR2="$HOME/toto/titi";

          #eval $test;

          print $VAR2."\n";


          johann@5620-3024:~$ ./test.pl
          /home/toto/titi
          ----------------------------

          maintenant il me semble qu'il veut, dans le script perl, recupéré des valeurs de l'environnement.

          et là, google est notre ami
          perl et variable environnement

          nous renvoie entre autre sur :
          http://lists.ze-linux.org/2003-06/msg00293.html
          qui pose la meme question est optient une reponse
          http://lists.ze-linux.org/2003-06/msg00294.html
          • [^] # Re: Eval

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

            Dans mon exemple du dessus $test serai initialisé par la fonction qui parse le fichier shell contenant la définition de toutes ces variables, d'où le eval, parceque d'après ce que j'ai compris le fichier n'est pas sourcé, les variables d'environnement ne sont donc pas définies !
            • [^] # Re: Eval

              Posté par  . Évalué à 2.

              C'est exactement ce dont j'avais besoin !
              Merci beaucoup pour votre aide !
  • # Config::General

    Posté par  . Évalué à 1.

    Comme l'a dit peck, eval peut devenir une faille de sécurité. Si c'est un problème pour toi, je te propose d'utiliser Config::General
    use Config::General;
    my $conf = new Config::General(
    			       -ConfigFile => "/chemin/vers/fichier/config",
    			       -InterPolateEnv => 1
    			       )
        || die "Bouh!";
    my %config = $conf->getall;
    print $config{VAR2}, "\n";
    
    Si la sécurité ne t'inquiète pas, garde la solution eval qui est plus simple...

Suivre le flux des commentaires

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