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:
1 2 3 4 5
| #!/usr/bin/perl
package toto1;
use strict; use warnings;
sub hello { print "toto\n"; } |
torequire2.pl
Code:
1 2 3 4 5
| #!/usr/bin/perl
package toto2;
use strict; use warnings;
sub hello { print "titi\n"; } |
require.pl
Code:
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 ?