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 :

include en perl et la portée des variables


Sujet :

Langage Perl

  1. #1
    Membre chevronné

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

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

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut include en perl et la portée des variables
    Hello tout le monde,

    je continue dans ma découverte du perl qui fait plus de 20 lignes (j'exagère à peine )

    j'ai donc un programme un peu plus long que d'habitude... et pour des raisons évidentes, je voulais découper ce dernier

    j'ai commencé par faire 2 classes (package machin, use strict et use warnings dans chaque fichier) : parfait !

    ensuite, j'ai voulu découper mon fichier principal en deux... en fait, ce fichier comporte une partie principale et toute une tripotée de fonctions (à l'origine, je ne voulais pas faire de classe pour cette partie mais je finirais peut être par changer d'avis...)

    bref, j'ai donc un fichier main.pl qui appelle un autre fichier fonctions.pl par un require 'fonctions.pl'

    j'arrive très bien à utiliser les variables de main.pl dans fonctions.pl (en les déclarant par "our") mais use strict et use warnings n'ont pas d'effet dans mon fonctions.pl (je peux très bien avoir une variable qui n'existe pas sans message d'erreur). Et si j'ajoute use strict et use warnings dans mon fonctions.pl, alors j'ai des erreurs sur les variables définies par our...

    je posterais un petit exemple plus tard (je dois décoller en we là), mais si quelqu'un a une bonne méthodologie pour faire ça (un simple include), je suis preneur

    ++

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Je ne suis pas sûr de bien comprendre, ce serait effectivement bien que tu postes un exemple.

    D'une manière générale (il peut y avoir des exceptions), ce n'est pas une très bonne idée d'utiliser des variables globales, surtout si tu commences à découper ton programme en plusieurs scripts. AMHA, il vaut mieux passer les variables en paramètres à tes fonctions (voire des références à tes variables si celles-ci contiennent des structures de données un tant soit peu volumineuses).

  3. #3
    Membre chevronné

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

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

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    Ouais, je me doutais que ça serait plus simple avec un exemple ^^

    Donc voilà l'idée :
    1er script : ex.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
    17
    use strict;
    use warnings;
     
    our %HoF = (
        exit	=>	{ func => \&end, desc => "exit\n\tSort du programme\n"},
        help	=>	{ func => \&show_help, desc => "help [commande]\n\tAffiche l'aide générale ou d'une commande spécifique si indiquée\n"},
        test	=>	{ func => \&test, desc => "test\n\tNe fais rien\n"},
    );
     
    require 'func.pl';
     
    while (<STDIN>) {
    	next if (!/\S/);
    	my ($cmd, @args) = split (/\s/,$_);
    	if   ($HoF{lc $cmd}) { $HoF{lc $cmd}{func}(@args) }
    	else { warn "Commande inconnnue: <$cmd>; Taper 'help' pour l'aide.\n" }
    }
    2ème script : func.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
    sub show_help {
    	my ($func) = @_;
    	if (defined $func) { print "$HoF{$func}->{desc}\n" }
    	else {
    		print "Liste des fonctions disponibles (help <fonction> pour plus d'informations) :\n";
    		foreach (sort keys %HoF) { print "\t- $_\n"; }
    	}
    }
     
    sub test { print "Ceci est un test :\n\t*** Hello World!***\n\ttoto=$toto\n"; }
     
    sub end { print "Ok, bye!\n"; exit 0; }
     
    1;
    Si je lance le programme ex.pl (perl ex.pl), ça marche bien et je n'ai pas de message d'erreur (alors que j'ai une variable $toto dans ma fonction test du fichier func.pl qui n'est pas définie...)

    Et si j'ajoute un use strict et un use warnings dans func.pl, ça plante car il ne connaît pas %HoF et compagnie...

    Mon truc, c'est que je voulais juste faire un func.pl pour éviter d'avoir des centaines de lignes de fonctions définies dans mon fichier principal, et je cherchais simplement à faire un genre d'include. Mais dans l'idée, c'est un seul et même fichier : j'ai aussi 2 classes dans mon programme qui gère d'autres données et qui n'ont pas à avoir accès à ces variables qui sont définies ailleurs.

    En gros, si je prends le contenu de func.pl et que je le colle à la fin de mon ex.pl, ça marche et $toto est bien remonté en erreur. Mais pour des raisons de lecture, je voulais prendre toutes les fonctions et les définir dans un second fichier : c'est possible ?

  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
    Je déteste cette façon de programmer. Pour ce genre de chose, je recommande vivement de faire un programme func.pm et non .pl. De le faire en objet (c'est assez basique) et ensuite de l'appeler propement dans ton ex.pl comme un module. Ainsi, tu profiteras des méthodes de ton .pm.

    Pour les variables à échanger, tu les passent en argument à tes méthodes.

    De plus, revoit ton algorithme car cette écriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    our %HoF = (
        exit	=>	{ func => \&end, desc => "exit\n\tSort du programme\n"},
        help	=>	{ func => \&show_help, desc => "help [commande]\n\tAffiche l'aide générale ou d'une commande spécifique si indiquée\n"},
        test	=>	{ func => \&test, desc => "test\n\tNe fais rien\n"},
    );
    m'interpelle un peu. Je ne pense pas qu'il soit judicieux de faire ceci : func => \&end, desc.

    Voilà.

    Pour l'objet, on a de très bons articles dans la rubrique Perl.

  5. #5
    Membre chevronné

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

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

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    alright, c'est clair comme ça

    comme je l'ai dit, j'ai 2 autres classes dans le programme complet, donc si j'ai fait ça comme ça pour cette partie là, c'est parce que je voyais moins l'intérêt de faire une 3ème classe (j'ai 2 onglets sur les articles objets de perl ouverts ici :p) !

    mais bon, je vais réfléchir à une meilleure solution alors ^^ ça va sûrement être de simplement regrouper le ex.pl et le func.pl dans une seule classe et l'appeler : ça ne résoudra pas complètement la séparation des fonctions et du reste, mais au moins, ça ne sera pas dans le programme principal !

    par contre, qu'est ce qui te pose problème dans le hash de fonction ?

  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
    Pour le hash, tu appelles des soubroutines qui ne sont pas forcément dans le même prog. Et c'est pire si ces soubroutines devenaient des méthodes .
    Mais bon, si tu regroupes tout dans le même programme, ça ne me généra plus :-) !

  7. #7
    Membre chevronné

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

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

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    ok

    (j'ai commencé... vla le bordel à tout passer en classe )

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

Discussions similaires

  1. Portée des variables: Include dans une fonction
    Par BlindeKinder dans le forum Langage
    Réponses: 9
    Dernier message: 08/02/2011, 18h45
  2. Portée des variables perl
    Par lilian_h dans le forum Langage
    Réponses: 15
    Dernier message: 04/06/2010, 09h04
  3. Réponses: 4
    Dernier message: 22/02/2010, 01h13
  4. [XSL]Problème de portée des variables
    Par djulesp dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/09/2004, 10h34
  5. [Portée] portée des variables
    Par parksto dans le forum Langage
    Réponses: 7
    Dernier message: 09/05/2004, 21h05

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