Il existe deux différences entre 'use' et 'require'. L'un d'entre eux affecte votre problème actuel, l'autre non. Malheureusement, vous travaillez autour d'un qui n'a aucun effet.
Les différences sont les suivantes:
1/'utilisation' appelle la fonction d'importation(), 'require' ne fonctionne pas. 2/'use' arrive à la compilation, 'require' arrive à l'exécution.
Vous travaillez sur le fait que 'require' n'appelle pas import() en l'appelant explicitement. Cela n'a aucun effet car votre module n'exporte aucun symbole et n'a pas de sous-programme import().
Vous ne travaillez pas sur le fait que les instructions 'use' sont exécutées lors de l'exécution. Le problème est que "use constant SERVICE_URL => APIconfig :: SERVICE_URL();" est exécuté au moment de la compilation et votre 'require' n'est pas exécuté alors myPackage ne sait rien à propos d'APIconfig.
La solution (méchante, hacky) consiste à placer l'instruction 'require' dans un bloc BEGIN - pour le forcer à être exécuté au moment de la compilation. Vous devrez également supprimer l'appel à import() car cela provoque une erreur d'exécution (en raison de l'absence de la sous-routine).
Les fichiers de test que je travaillais ceci sont les suivantes:
$ cat APIconfig.pl
package APIconfig;
use constant SERVICE_URL => 'http://api.example.org/blah';
1;
$ cat api.pl
#!/usr/bin/perl
package myPackage;
BEGIN {
require "APIconfig.pl";
}
# APIconfig::import(APIconfig);
use constant SERVICE_URL => APIconfig::SERVICE_URL();
print SERVICE_URL, "\n";
$ ./api.pl
http://api.example.org/blah
La vraie solution consiste à réécrire APIconfig comme un véritable module. Vous indiquez que vous le savez, mais que les problèmes environnementaux vous empêchent d'adopter cette approche. Je recommande fortement d'essayer de contourner ces problèmes et de faire les choses correctement.