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 :

require et utilisation de variable


Sujet :

Langage Perl

  1. #1
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut require et utilisation de variable
    Bonjour à tous,

    cela m'embête de poser une question aussi simple (à première vue)... mais je cherche depuis assez longtemps pour me dire qu'il est temps de demander =)

    voilà, j'ai un programme Perl dans lequel je voulais mettre une grosse (600 lignes) table de hachage avec moultes valeurs prédéfinies dedans.

    Pour faire moins crade (et après quelques recherches), je me suis dit que j'allais sortir cette variable et faire un include du fichier dans lequel elle était définie. Je me suis basé sur un truc du style :
    http://perso.univ-rennes1.fr/francoi...00000000000000

    Le problème, c'est ça fonctionne sauf quand j'utilise "use strict;".

    Or, j'utilise toujours use strict et je ne veux pas le virer (parce que je suppose que si je devais le virer, c'est que c'est pas bien programmé).

    Quand j'ajoute "use strict;" au programme donné en exemple, j'obtiens ce message:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Global symbol "$I" requires explicit package name at test1.pl line 10.
    Execution of test1.pl aborted due to compilation errors.
    Donc ma question: comment je peux faire ça proprement.

  2. #2
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    ton message d'erreur signifie que la variable $I n'a pas été déclaré avec my, c'est tout.

  3. #3
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Ou avec our().

    Le pragma strict impose la déclaration explicite des variables lexicales (my()) ou globales (our()), cela évite les fautes de frappes entre autres.

    Néanmoins la description de ton problème m'amènerais plus à utiliser un fichier de configuration (plus user-friendly) ou carrément un fichier DB si l'utilisateur n'a pas à manipuler ce hash.

    --
    Jedaï

  4. #4
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Bonjour,

    déjà, merci pour vos réponses, mais non, ce n'est pas un oubli de "my" ni de "our" (j'aurais du préciser que j'avais testé ça aussi) :/

    J'ai toujours le même message en ajoutant ces 2 mots clés... (je remets les 2 sources ci-dessous au cas où j'aurais fait une grossière erreur , mais je ne vois pas =)

    Pour ce qui est de l'utilisation d'un fichier de configuration ou une DB, à l'origine, je ne l'ai pas fait pour un certains nombre de raisons (besoin de finir le script rapidement, pas de nécessité de modifier cette variable, etc.)... Mais il va sans dire que j'ai bien marqué que c'était "pour faire moins crade" et non pas "pour être clean"... je suis conscient du fait que ça ne soit absolument pas joli-joli, mais de temps en temps, faut bien faire des entorses aux règles

    edit: le code source

    monmodule.pl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    our $I = 2;
    sub fonc {
    	print ("appel de fonc() \n");
    }
    test.pl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/usr/local/bin/perl
    use strict;
    use warnings;
    require "monmodule.pl"; 
    fonc();
    print ("I = $I \n");
    résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    S:\Projets\>perl test.pl
    Global symbol "$I" requires explicit package name at test1.pl line 11.
    Execution of test.pl aborted due to compilation errors.

  5. #5
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    require n'est pas un véritable "include", il est un peu plus propre que ça...

    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
    package MonModule;
    use strict use warnings;
    use base 'Exporter';
     
    our @EXPORT = qw($I fonc);
     
    our $I = 2;
    sub fonc {
    	print ("appel de fonc() \n");
    }
     
     
    1;
    test.pl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/local/bin/perl
    use strict;
    use warnings;
    use lib '.';
    use MonModule;
     
    fonc();
    print ("I = $I \n");
    Utilise toujours des vrais modules, ce sera plus propre et pas beaucoup plus compliqué à mettre en place.

    --
    Jedaï

  6. #6
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Whouhou !!

    Effectivement, ça marche et c'est un poil plus propre =)

    Merci pour l'info, il est vrai que je ne m'étais jamais trop penché sur les packages je pensais que c'était plus complexe que cela !

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

Discussions similaires

  1. Utilisation de variables dans plusieurs classes
    Par dedeloux dans le forum Langage
    Réponses: 3
    Dernier message: 20/07/2005, 17h25
  2. Réponses: 4
    Dernier message: 11/07/2005, 11h03
  3. Réponses: 7
    Dernier message: 07/09/2004, 14h16
  4. [XSL] utiliser une variable pour nom d'élément
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 13
    Dernier message: 07/09/2004, 13h58
  5. Utiliser des variables d'environnements
    Par Xam335 dans le forum C++Builder
    Réponses: 2
    Dernier message: 14/08/2004, 14h15

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