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 :

appel de fonction dans un autre fichier


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut appel de fonction dans un autre fichier
    Bonjour à tous,

    Il est possible que cette question ai déjà été posé dans le forum mais pour vous dire la vérité j'ai commencer le perl il y a maintenant uen semaine

    Alors c'est simple, j'ai deux fichier perl ou dans l'un il y a mon code principale et l'autre mes procédures.

    J'aimerais pouvoir faire appel au proc dans mon fichier principal, le souci c'est que le fichier où sont contenu les procédure est ré-actualisé assez souvent.

    j'ai pensé à utiliser system mais je crois que c'est une mauvaise idée



    Amicalement

    new fan of Perl

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Le mieux est effectivement de définir ton fichier contenant les procédures comme un module (ou mieux, un module orienté objet).
    Tu trouveras une abondante littérature dans les manuels perl :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    perldoc perlmod
    perldoc Exporter
    perldoc perlboot
    perldoc perltoot

    Sans oublier l'article sur la POO de djibril : http://djibril.developpez.com/tutoriels/perl/poo/

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Après j'ai un souci qui est la traduction.

    Petite explication : Je ne connais pas les procedures et leurs noms sont stockées dans un $i. Appellons ma class Machine, est ce que Machine->$i() marche ?

    Je pense bien sur que non, à ce moment la est ce eval (Machine->$i()) marche ? Je pense que non aussi vu qu'ils ne sont pas dans le meme fichier.

    Enfin bref je suis un peu perdu ...

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Une méthode d'une classe s'appelle plus simplement
    $objet->method(...).

    Je ne comprends pas comment tu fais pour avoir des méthodes en $method.

    Pour t'aider un peu plus, peut-être pourrais-tu nous donner une partie de tes sources (la classe et le script qui l'utilise).

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Justement le souci c'est que le nom de la classe est enregistrer dans une variable

    prenons un fichier text ou le nom de la sous proc est ecrit
    on recupere le nom qu'on met dans $a
    comment appeller la procudure $a qui est ecrite dans un autre fichier perl

    J'espere etre le plus claire possible

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Mmmm, c'est le nom de la classe qui est écrit dans une variable, ou bien le nom de la méthode, ou bien encore autre chose ?

    Pourrais-tu poster tes exemples, je n'arrive toujours pas à comprendre ton problème, car en tant que débutant en perl, tu ne devrais pas avoir à définir des noms de méthodes dans des variables, car c'est un usage avancé (et périlleux) des références et de la table des symboles perl (déréférencement d'une string en nom de variable). Cette pratique est d'ailleurs interdite si tu utilises les donc modules suivant fortement recommandés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use strict;
    use warnings;

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Pour dire la vérité je ne suis pas propriétaire du code, je travaille déçu et suis la personne qui doit le modifier. Je vais quand même tenter de te spécifier le contexte

    Fichier principal (appelons le main.pl) : Il est appelé par l'utilisateur qu'il lui donne en entrée un fichier .txt (pour faire simple appelons le text.txt), main.pl récupère de nombreuses donnée dans text.txt, parmis celle-ci un certain nombre de nom de sous procédure.

    Dans l'état actuel des choses, les noms des procédures sont enregistrer dans $name1, $name2 ... Elles sont ensuite tester dans main.pl à l'aide d'un bloc if ENORME (imagine qu'il y ai 100 sous-proc).

    En plus d'avoir un main.pl charger, il est impossible à l'equipe dev de dev des news proc puisqu'il faudrait ajouter pour chacune de celle ci (ou presque) un if dans main.pl

    L'idée et donc de dégager le bloc if et de mettre l'implemantation des sous-proc (sub proc1{}, sub proc2{}) dans un autre fichier perl (ssProc.pl ou ssProc.pm)

    Ainsi main.pl serait alléger et il suffirait d'échanger le bloc if par un simple "$name1()" "$name2" ...

    Ma question étant comment ecrire $name1() et $name2() dans main.pl

    J'espère avoir été assez claire, en tout cas merci de ton attention

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Dans ce cas, utilisez le module Exporter pour exporter vos noms de procédures dans le fichier ssProc.pm, et require dans le module main.pl
    Ensuite, vous devriez pouvoir utiliser vos procédures ainsi :
    ou encore

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Après avoir chercher dans les bouquins je me suis dit que normalement eval réponds à mes attentes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sub aff{
           print "Hello world\n";
    }
    $name = "aff";
    eval $name;
    Bon c'est une version très simplifier de ce que je voulais, maintenant il ne me reste plus qu'à créer le package ou seront implémenter les méthodes et normalement je pourrais appelé les méthodes grâce à eval

    Est ce que je rentre dans le mur la ou suis je bien sur le bon chemin

  10. #10
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    Points : 272
    Points
    272
    Par défaut
    Pour pouvoir utiliser &$name() il te faut le pragma :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    use strict;
    no strict "refs";

  11. #11
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Plutôt que d'utiliser eval, utilises donc Exporter et require, ils sont fait pour ça.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Merci ça marche et c'est exactement ce dont j'avais besoin, je me rends compte aussi du danger de eval ( eval 'rm *' )

    C'est vraiment cool.

    J'ai plus qu'à me mettre au boulot merci encore

  13. #13
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Si tu as trouvé ton bonheur avec require et Exporter, tente d'aller plus loin avec la programmation OO
    (perldoc perltoot, dossier DVP), ...)

    Et n'oublie pas de mettre ton sujet en résolu...

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

Discussions similaires

  1. Appeler fonction dans un autre fichier mxml
    Par cecile38 dans le forum Flex
    Réponses: 3
    Dernier message: 05/01/2011, 16h53
  2. Réponses: 2
    Dernier message: 05/03/2009, 15h52
  3. Réponses: 4
    Dernier message: 15/09/2008, 14h43
  4. appel d'une fonction dans un autre fichier jss
    Par Davee dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 28/06/2008, 20h12
  5. appel d'une fonction dans un autre fichier
    Par funboard dans le forum Langage
    Réponses: 2
    Dernier message: 08/02/2008, 09h26

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