IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Inclure un fichier d'environnement


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 49
    Points : 26
    Points
    26
    Par défaut Inclure un fichier d'environnement
    Bonjour,

    je souhaiterai pouvoir inclure dans un script perl un fichier contenant des variables positionnées en fonction d'un paramètre passé en argument, de la même façon que l'on peut le faire en shell sur unix.

    Exemple: Le fichier contenant les variables liste_var.pl:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!C:\perl\bin\perl -w
     
    use strict;
     
    for ($ARGV[0]) {
         if (/CAS1/) {VAR1="1";}
         else (/CAS2/) {VAR1="2";}
    }
    Mon fichier principal main.pl:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!C:\perl\bin\perl -w
     
    use strict;
     
    require "liste_var.pl $ARGV[0]";
     
    print "$VAR1\n";
    J'execute mon main.pl en lui passant mon parametre en argument:

    Et ça ne marche pas ...
    Pourriez-vous m'orienter sur la démarche à suivre pour réaliser une telle procédure svp ?

    Pour faire l'analogie avec le shell, c'est comme si je voulais executer un fichier d'environnement dans un script en l'appelant de la manière suivante:
    Merci d'avance pour vos eclaircissements.

    Bruno

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Je trouve que cette façon de vouloir faire n'est vraiment pas propre. Que souhaites tu concrètement faire ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 49
    Points : 26
    Points
    26
    Par défaut
    Tout d'abord merci de t'intéresser à mon cas !

    Ce que je veux faire:

    Je dois industrialiser des traitements qui seront les mêmes pour 14 sites hébergés. Seules certaines variables différeront (4 à 5 variables).
    Je veux donc avoir 1 seule architecture d'indus à laquelle je passe le code du site, ce qui aura pour conséquences d'utiliser les bonnes valeurs de variables.

    Je voulais donc avoir un seul fichier contenant la liste des sites (comme le case/esac du shell) qui positionnerait les variables aux bonnes valeurs en fonction du parametre que je lui passe. Et pouvoir appeler ainsi ce fichier depuis mon indus principale sans avoir à refaire le test du code systematiquement.

    Est-ce plus clair ?

    C'est une méthode que j'emploie couramment en shell sur unix et que je n'arrive pas à reproduire en perl (sous windows).

    J'ai vu qu'on pouvait faire appel à un script perl avec la fonction "require", ou alors "do" ou encore "use". Mais je ne m'en sors avec aucune des trois ...

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Tu pourrais créer un .pm dans lequel tu fais des procédures qui retourne soit une données quelconque de type scalar. Ou bien, la/les procédures peuvent retourner une référence de hash de scalar que tu utilise ensuite dans ton script principal.

    Voici un exemple fait à la va vite en objet.

    MonModule.pm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    package MonMondule;
     
    use warnings;        
    use strict;         
    use Carp;          
     
    my $var1 = 1;
    my $var2 = 2;
     
    # Constructeur de la classe MonMondule
    sub new {
      my ( $classe, $ref_arguments ) = @_;
     
      # Vérifions la classe
      $classe = ref($classe) || $classe;
     
      # Création de la référence anonyme à un hachage vide (futur objet)
      my $this = {};
     
      # Liaison de l'objet à la classe
      bless( $this, $classe );
     
      return $this;
    }
     
    sub get_refvariable {
      my ($this, $argument) = @_;
     
      if ( $argument eq 'CAS1' ) {
        return $var1;
      }
      elsif ( $argument eq 'CAS2' ) {   
        return $var2;
      }
      else {
        croak("Mauvais argument\n");
      }
     
      return;
    }
     
    1;
    main.pl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/perl
    use warnings;        
    use strict;         
    use Carp;          
    use MonMondule;
     
    my $obj = MonMondule->new();
    print "Resultat : ",$obj->get_refvariable('CAS1'),"\n";

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 49
    Points : 26
    Points
    26
    Par défaut
    Merci pour ta réponse.
    Je vais me pencher sur ta proposition.

    Ce qui me chagrine, c'est de devoir passer par un module (.pm). Si une modification des variables (ajout ou suppression) est nécessaire, il faudra refaire le module à chaque fois. Ca me parait peut etre lourd à gérer, je ne me rends pas bien compte car je ne l'ai jamais fait, mais si c'est LA méthode efficace, alors je l'utiliserai volontiers.

    Merci encore.
    Bruno

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    A la base tu souhaitais également utiliser un .pl à part, donc ça revient au même, tu n'as qu'un fichier à part à utiliser .

    En ce qui concerne le .pm, je n'ai fais qu'un exemple simple. Si tu souhaites faire certaines choses plus précises, tu peux toujours créer des méthodes dont le rôle sera de modifier la variable ou non.

    Essaye de mettre clairement sur papier ce que tu souhaites faire et ensuite dis le nous, on pourra plus facilement t'aider.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 49
    Points : 26
    Points
    26
    Par défaut
    Pour être plus clair, il faudrait que j'explique la façon dont je procède en shell ...
    Après il ne resterait plus qu'à faire la transposition d'un langage à l'autre.
    Est-ce que je peux faire ça ici dans le thread réservé au perl ?

  8. #8
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    oui, vas y

  9. #9
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 49
    Points : 26
    Points
    26
    Par défaut
    Voici la méthode que j'utilise en shell:

    Je dois automatiser une chaine de traitements dans un automate.
    Cette chaine de traitements est composée de plusieurs scripts, généralement 1 script par action à effectuer pour pouvoir mieux monitorer et analyser

    les erreurs en cas de plantage.
    Globalement, il y a cet ensemble de scripts:

    1. script1.sh: test d'existence d'un fichier (avec génération d'un code retour différent selon que le fichier existe ou non)
    2. script2.sh: transfert du fichier en question vers un autre serveur applicatif par ftp
    3. script3.sh: execution d'un job d'intégration pour intégrer le fichier dans la base de l'application
    4. script4.sh: diverses taches de nettoyage.

    Cet enchainement doit être fait pour 35 sites (et non pas 14!). Les seules différences sont les valeurs des variables spécifiques à chaque site.

    En shell, mon automate execute ces scripts les uns après les autres avec des contraintes de dépendances diverses (codes retours, etc...).
    Je passe à mon automate le code site qui est transmis à chaque script de façon à ce que les valeurs des variables soient positionnées pour chaque site lors de l'execution.

    Je crée donc un fichier d'environnement (site.env) qui a cette structure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SITE=$1
     
    case $SITE in
    	site1) var1=valeur1; export var2=valeur1; var3=valeur1 ;;
    	site2) var1=valeur2; var2=valeur2;  var3=valeur2 ;;
    ...
    	site35) var1=valeur35; var2=valeur35; var3=valeur35 ;;
    esac
    export var1 var2 var3 ... var35
    Chacun des script1.sh ...scripts4.sh appel en début de script le fichier "site.env" et lui passe le code du site à traiter:

    script1.sh:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/ksh
     
    SITE=$1
     
    . site.env $SITE
     
    Ensuite tout le code shell qui va utiliser les différentes variables var1, var2, var3, etc ...
    De cette façon, les variables sont accessibles aux différents scripts de ma chaine avec les valeurs spécifiques à chaque site. (un peu comme le principe d'un .profile pour chaque utilisateur).

    Maintenant, je dois faire la même chose sur windows en perl. Je veux reproduire le même schéma d'architecture. Chaque script shell a son équivalent en perl, et ce que je n'arrive pas à transposer, c'est l'appel à un fichier centralisé "site_env.pl" en début de chaque script perl qui positionnera les variables aux bonnes valeurs pour chaque site.
    Ca m'eviterait d'écrire 35 procédures qui ne différent que par le contenu de chaque variable spécifique à chaque site.
    Une simple inclusion/execution d'un fichier d'environnement paramétrable.

    Est-ce plus clair ?

    Bruno

  10. #10
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Ok, je vois un peu mieux que tu souhaites faire. Je vais essayer de te faire un exemple, tu me dira si ça te convient.

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Alors, voici le code que je t'ai promis, dis moi si ça correspond à tes attentes.

    Premièrement, j'ai crée un .pm dans lequel tu pourras stocker toutes tes variables d'environnement, c'est à dire, les contenus des variables qui changerons en fonction du script/ou code appelant. Le .pm est écrit en POO basique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    package SiteEnv;
     
    use warnings;        
    use strict;         
    use Carp;          
     
    # Stockons toutes les données nécessaires de tous les sites
    my %DATA_ENV = (
      site1 => {
        var1 => 'valeur1',
        var2 => 'valeur2',
        var3 => 'valeur3',
        var4 => 'valeur4',
      },
      site2 => {
        var1 => 'toto1',
        var2 => 'toto2',
        var3 => 'toto3',
        var4 => 'toto4',
      },
      site3 => {
        var1 => 'varsite1',
        var2 => 'varsite2',
        var3 => 'varsite3',
        var4 => 'varsite4',
      },
    );
     
    # Constructeur de la classe SiteEnv
    sub new {
      my ( $classe, %ref_arguments ) = @_;
     
      # VÚrifions la classe
      $classe = ref($classe) || $classe;
     
      # Création de la référence anonyme é un hachage vide (futur objet)
      my $this = {};
     
      unless ( exists $ref_arguments{site} ) {
        croak("Vous devez preciser un site\n");
      }
      $this->{site} = $ref_arguments{site};
     
      # Liaison de l'objet Ó la classe
      bless( $this, $classe );
     
      return $this;
    }
     
    sub get_variable {
      my ($this, $argument) = @_;
     
      if ( exists $DATA_ENV{ $this->{site} }{$argument} ) {
        return $DATA_ENV{ $this->{site} }{$argument};
      }
      else {
        croak("La variable $argument n'existe pas\n");
      }
     
      return;
    }
     
    1;
    Toutes tes variables sont dans un hash. Le constructeur attend un argument site qui contiendra site1, site2 ou autre. La méthode get_variable retournera le contenu de la variable en fonction de ce qui tu lui auras fourni.

    script1.pl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/usr/bin/perl
    use warnings;        
    use strict;         
    use SiteEnv;
     
    my $objet_SiteEnv = SiteEnv->new( site => 'site1');
    my $var1 = $objet_SiteEnv->get_variable('var1');
    my $var2 = $objet_SiteEnv->get_variable('var2');
    my $var3 = $objet_SiteEnv->get_variable('var3');
     
    print "\$var1 : $var1\n";
    print "\$var2 : $var2\n";
    print "\$var3 : $var3\n";
     
    # Suite du traitement du script 
    # ...
    Tu obtiens le résultat suivant :
    $var1 : valeur1
    $var2 : valeur2
    $var3 : valeur3
    Dans script2.pl, tu as juste à changer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $objet_SiteEnv = SiteEnv->new( site => 'site1');
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $objet_SiteEnv = SiteEnv->new( site => 'site2');
    J'ai opté pour un .pm écrit en objet car je trouve que c'est plus propre et te laisse la possibilité de faire beaucoup de choses différentes si besoin. Est ce bien ce que tu souhaites ?

  12. #12
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 49
    Points : 26
    Points
    26
    Par défaut
    Merci pour ton travail.

    Oui, ça a l'air de faire ce que je veux. Je vais le mettre en place pour test sur un site. Et je le déploierais ensuite sur tous les autres si celà convient.
    Je te tiendrais au courant.
    Merci.
    Bruno

  13. #13
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 49
    Points : 26
    Points
    26
    Par défaut
    Ca marche nickel.
    L'utilisation de classes me parait complexe, mais c'est dû à mon faible niveau de perl !
    Cette méthode me convient, merci encore.

    Bruno

  14. #14
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    si tu souhaites comprendre la programmation perl objet, j'ai écrit un tutoriel sur ce sujet ici.

  15. #15
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 49
    Points : 26
    Points
    26
    Par défaut
    Merci ! J'irai lire ça !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Inclure des Fichiers .XML et .PPT dans un version PhpBB 1.9
    Par DaddyP dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 20/01/2006, 09h54
  2. [Configuration] Inclure un fichier .c dans une page PHP
    Par Korma dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 18/01/2006, 12h49
  3. [C#] inclure un fichier css
    Par elendila dans le forum ASP.NET
    Réponses: 2
    Dernier message: 12/08/2005, 15h21
  4. Inclure un fichier html
    Par krfa1 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 08/02/2005, 14h40
  5. [HTML] inclure un fichier...
    Par mohican13 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 17/01/2005, 17h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo