perl et l'export d'une varible d'environement

perl et l'export d'une varible d'environement - Perl - Programmation

Marsh Posté le 26-12-2006 à 13:36:14    

salut,
 
Est il possible en perl de faire un export d' une variable d'environnement dans l'hypothese ou cette variable n'est pas defini ou si l'on souhaite modifier sa valeur ?
 
Merci

Reply

Marsh Posté le 26-12-2006 à 13:36:14   

Reply

Marsh Posté le 26-12-2006 à 13:46:40    

Pour quoi faire ?

Reply

Marsh Posté le 26-12-2006 à 14:02:00    

disons que dans mon script j'utilise une variable d'environnement
mais que cette variables d'environnement ne contient pas de valeur;
si j'execute mon script sa va bogué;
alors je souhaiterai tester et si elle n 'en contient pas, je lui en affecte une et ensuite je voudrais exporter cette variable pour pouvoir l'utiliser dans d'autre script;
(en shell on fait quelquechose comme sa mavariabeenv=toto;export mavariabeenv)

Reply

Marsh Posté le 26-12-2006 à 15:04:38    

Dans ce cas, tu peux modifier le hachage %ENV.
 
Exemple :

$ cat test.ksh
#! /bin/ksh
 
echo "machin = $machin"
 
$ cat test.pl  
#! /bin/perl
 
use strict;
 
print "Appel 1 - machin non positionné :\n";
system("test.ksh" );
 
$ENV{machin} = "abcdef";
 
print "Appel 2 - machin positionné :\n";
system("test.ksh" );
                                                                                                     
$ test.pl
Appel 1 - machin non positionné :
machin =  
Appel 2 - machin positionné :
machin = abcdef

Reply

Marsh Posté le 26-12-2006 à 16:33:51    

et le export je le fait quand ?

Reply

Marsh Posté le 26-12-2006 à 16:47:40    

J'ai fait exprès d'appeler un script ksh séparé pour montrer que la variable d'environnement est bien accessible aux processus fils dès lors qu'elle existe dans le hâchage %ENV.
Le "export" (qui est un mot-clef ksh, et non perl) est implicite.

Reply

Marsh Posté le 27-12-2006 à 09:33:43    

j'ai fait cela dans un script

Code :
  1. my $perlvari;
  2. if ( !defined( $ENV{"perlvari"} ) ) {
  3.     print "Saisir une valeur = ";
  4.     $perlvari = <STDIN>;
  5.     chomp ($perlvari);
  6.     $ENV{"perlvari"}=$perlvari;
  7.     print "Affichage de ma nouvelle valeur ".$ENV{"$perlvari"}."\n";
  8.    
  9.    
  10.     }
  11.   foreach my $k (keys(%ENV))
  12. {
  13.    print "Clef=$k Valeur=$ENV{$k}\n";
  14. }


 
quand je lance mon script la variable n'a pas de valeur,
donc je dois en saisir une;
je la saisi et ensuite j'ai une boucle qui m'affiche tous ce que je possede dans %ENV;
A l'affichage des données contenus dans mon %ENV,je constate bien que ma variable possede bien la nouvelle valeur, que j'ai saisi;
Mais le probleme, c'est que j'ai fait dans mon shell un echo de ma variable et la à ma surprise, ma variable est vide;
je relance mon script et il me redemande de saisir une valeur;
je comprend pas , pourtant quand je fait l'affichage du tableau,la variable d'environnement contient bien la bonne valeur  
????

Reply

Marsh Posté le 28-12-2006 à 09:20:57    

Est-ce que tu fais quelque chose comme ça ?

$ ton_script.pl
<saisie puis blabla>
$ echo $perlvari


 
Si oui, alors c'est normal. La modification des variables d'environnement n'est valable que pour le processus courant et, si la variable est "exportée", pour les processus fils.
 
Or, lorsque tu appelles un script PERL, il est lancé dans un processus fils à ton shell. Ton script a beau redéfinir ce qu'il veut dans les variables d'environnement, ton shell est le processus père, et n'est donc pas touché.

Reply

Marsh Posté le 28-12-2006 à 17:39:22    

comment cela Elmoricq, j'ai pas trop saisi ?

Reply

Marsh Posté le 28-12-2006 à 17:57:39    

Une modification des variables d'environnement ne s'applique qu'au processus courant et aux processus fils.
C'est de l'héritage, grosso modo. Un fils hérite de ses parents, mais pas l'inverse (cas théorique :o ).
 
Schématiquement :


- shell courant
 |--- un processus lambda
      |--- un fils du processus lambda
 |--- ton script PERL
      |--- un fils du script PERL
      |--- un autre fils du script PERL
            |--- un fils d'un fils du script PERL
      |--- une fille du script PERL, j'suis pas sexiste


 
Selon ce shéma, une modification des variables d'environnement dans ton script PERL ne profite qu'à ton script PERL lui-même, et à ses fils (et petits-fils, et arrière-petits-fils, etc.)
Par contre, le shell courant, le processus lambda et les fistons du processus lambda ne voient pas leurs variables d'environnement modifiées.

Reply

Marsh Posté le 28-12-2006 à 17:57:39   

Reply

Marsh Posté le 02-01-2007 à 13:04:07    

ok je comprends mieux
en gros ce que je souhaite faire,c'est pratiquement impossible

Reply

Marsh Posté le 02-01-2007 à 13:18:38    

Voila. Mais généralement, lorsque aucune solution technique n'existe, c'est qu'il y a un problème de conception.

 

Dis-nous ce que tu essaies de faire, il y a sans doute une façon simple d'y remédier.


Message édité par Elmoricq le 02-01-2007 à 13:18:48
Reply

Marsh Posté le 02-01-2007 à 18:58:04    

Bonjour,
j'ai exactement le même problème (mis à part que j'utilise un shell windows)
 
Elmoricq,  
Quelles sont les solutions possibles pour récupérer une variable d'un programme Perl lancé à partir d'un batch (.bat) ?
 
La possibilité de passer par un fichier ne me plait pas trop, je trouve çà plutôt dangereux (par exemple, dans le cas ou le fichier d'un ancien traitement est resté par erreur et est réutilisé dans la nouvelle exécution du script...).
Mais peut-être que je ne vois pas tout le potentiel de cette possibilité.  
 
Si quelqu'un a des idées, je suis preneur !! :)

Reply

Marsh Posté le 02-01-2007 à 21:52:26    

Si l'exécution de ton script ressemble à quelque chose comme ça :

 

C:\>script.bat
 |--- le script fait des trucs
 |   puis appel du programme PERL
     |--- exécution du programme PERL
 |    et retour au script

 

Et si tu veux, une fois revenu au script, utiliser des données créées par le programme PERL, alors tu disposes de deux solutions :

  • utiliser la sortie standard : dans le programme PERL, tu imprimes tes données avec de simples printf(), c'est facilement retraitable en script/batch.
  • imprimer le résultat du programme PERL dans un fichier : pour pallier au souci de mauvaise exécution que tu évoques, il suffit de spécifier au programme PERL le nom du fichier dans lequel écrire, et tu crées ce nom de fichier à chaque exécution avec une partie variable (un horodatage, ou un numéro de processus, ou autre chose...). Ou bien, si tu préfères un nom de fichier unique en mode annule&remplace, tu l'effaces en début de batch :o


Il s'agit là de problèmes de conception en fait, le fait qu'il s'agisse de PERL, de shell script ou de batch n'y change rien. [:klem3i1]


Message édité par Elmoricq le 02-01-2007 à 21:54:26
Reply

Marsh Posté le 03-01-2007 à 12:08:19    

Merci pour ta réponse :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed