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 ?