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 :

Sélection nom de module par une variable


Sujet :

Langage Perl

  1. #1
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut Sélection nom de module par une variable
    Bonjour à tous, voici la dernière question existencielle qui me tracace : est-il possible de référencer un nom de package par une variable et faire appel à ses méthodes grâce à cette variable;

    Mon cas pratique, version très simplifiée:

    j'ai 2 fichiers, torequire1.pl et torequire2.pl, qui vont être inclus par un fichier require.pl. jusque là, c'est classique.

    Là où tout se complique, c'est que require.pl n'a pas connaissance à l'avance des noms des fichiers à inclure, ni du nombre de fichiers à inclure (c'est paramétré dans un fichier de configuration).

    torequire1.pl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/usr/bin/perl
    package toto1;
    use strict; use warnings;
     
    sub hello { print "toto\n"; }
    torequire2.pl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/usr/bin/perl
    package toto2;
    use strict; use warnings;
     
    sub hello { print "titi\n"; }
    require.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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #!/usr/local/bin/perl
    use strict; use warnings;
     
    BEGIN {
    	map { require $_; } (
    		'torequire1.pl' ,
    		'torequire2.pl' ,
    	);
    }
     
    # CAS 1) fonctionne, mais implique de connaitre à l'avance les noms 'toto1' et 'toto2'
    toto1::hello();
    toto2::hello();
     
    # CAS 2) ne fonctionne pas :o(
    map { 
    	my $package = $_;
            eval "$package::hello();";
    } (
    	'toto1' , 
    	'toto2' ,
    );
     
     
    # CAS 3) fonctionne, mais implique également de connaitre toto1 et toto2 :o(
    our %hashfunctions = (
    	'toto1' => \&toto1::hello ,
    	'toto2' => \&toto2::hello ,
    );
     
    map { 
    	my $package = $_;
    	my $subref = $hashfunctions{$package}; 
    	&$subref();
    } (
    	'toto1' , 
    	'toto2' ,
    );
    Ce qui m'interresserait : réussir à faire fonctionner le cas 2, ou bien le cas 3 mais avec une variable pour référencer le nom du package dans l'initialisation.

    Pensez-vous que ce soit possible, et avez-vous une idée sur comment réussir à réaliser ceci, ou bien est-ce que je fais fausse route ?

  2. #2
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Erf, j'ai trouvé, le problème venait d'une erreur de syntaxe causée par le :: ...

    ceci fonctionne:

    require.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
    18
    19
    20
    21
    #!/usr/local/bin/perl
     
    use strict; use warnings;
     
    BEGIN {
    	map { require $_; } (
    		'torequire1.pl' ,
    		'torequire2.pl' ,
    	);
    }
     
    map { 
    	my $package = $_;
    	my $funcname = sprintf('%s::hello()', ($package));
    	eval "$funcname";
    	print $@, if $@;
    } (
    	'toto1' , 
    	'toto2' ,
    	'toto1' , 
    );

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 41
    Points
    41
    Par défaut
    Je suis pas sur de bien répondre a ta question, mais je te propose ca:
    d'utiliser tes packages comme des objets....
    tu as essayer de faire


    #Tu les import
    use toto1;
    use toto2;

    my $toto1 = new->toto1(); # tu cré un nouvel objet

    $toto1->hello(); # et tu appel ta méthode.

    ais-je pu t'aider ou est-ce que j'ai complètement tappé en touche ?

  4. #4
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    non, ta solution ne me convient pas, dans le sens ou elle implique de connaitre à l'avance les noms toto1 et toto2, ce qui n'est pas mon cas (c'est lu dans un fichier de propriétés).

    Mais j'ai trouvé la solution entre temps, voir au-dessus de ton message...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 41
    Points
    41
    Par défaut
    ok je vois, j'avais mal compris ton message initial alors, je te pris de bien vouloir m'excuser d'avoir fait un post qui sert a rien.


  6. #6
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    oh, y'a pas de mal, merci d'avoir tenté de répondre à ma question, même si ce n'était pas la réponse que j'attendais

  7. #7
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par MarneusCalgarXP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # CAS 2) ne fonctionne pas :o(
    map { 
    	my $package = $_;
            eval "$package::hello();";
    } (
    	'toto1' , 
    	'toto2' ,
    );
    Effectivement ton erreur est là, je te propose une syntaxe légèrement différente de ce que tu as fini par trouver :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    map { 
    	my $package = $_;
            eval "\$${package}::hello();";
    } (
    	'toto1' , 
    	'toto2' ,
    );
    --
    Jedaï

  8. #8
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Si j'essaie ta solution, ca ne fonctionne pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
    map { 
    	my $package = $_;
    	eval "\$${package}::hello();";
    	print $@, if $@;
    } (
    	'toto1' , 
    	'toto2' ,
    );
    Si j'affiche le contenu de $@, voici ce que j'obtiens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    syntax error at (eval 1) line 1, near "$toto1::hello("
    syntax error at (eval 2) line 1, near "$toto2::hello("

  9. #9
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Désolé, j'avais pas fait attention : tu appelles une fonction, tu ne récupères pas une variable... Du coup c'est encore plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    map { 
    	my $package = $_;
    	eval "${package}::hello();";
    	print $@, if $@;
    } (
    	'toto1' , 
    	'toto2' ,
    );
    (l'erreur syntaxique était à cause du \$)

    --
    Jedaï

  10. #10
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Wep, là ca fonctionne mieux

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/09/2014, 11h10
  2. Réponses: 0
    Dernier message: 22/06/2010, 15h53
  3. Réponses: 2
    Dernier message: 06/11/2007, 13h23
  4. Réponses: 3
    Dernier message: 18/10/2007, 18h33
  5. Remplacer nom d'un forulaire par une variable
    Par kevain_09 dans le forum VBA Access
    Réponses: 2
    Dernier message: 19/06/2007, 14h06

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