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
torequire2.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"; }
require.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"; }
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.
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' , );
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 ?
Partager