La raison pour laquelle votre push n'a pas fonctionné est probablement l'ordre d'exécution.
use
est une directive de compilation. Vous push
se fait au moment de l'exécution:
push (@INC,"directory_path/more_path");
use Foo.pm; # In directory path/more_path
Vous pouvez utiliser un bloc BEGIN pour contourner ce problème:
BEGIN {
push (@INC,"directory_path/more_path");
}
use Foo.pm; # In directory path/more_path
OMI, il est clair, et donc mieux use lib
:
use lib "directory_path/more_path";
use Foo.pm; # In directory path/more_path
Voir perlmod pour plus d'informations sur BEGIN et d'autres blocs spéciaux et quand ils s'exécutent.
Modifier
Pour le code de chargement par rapport à votre script/bibliothèque, je souscris fortement File::FindLib
Vous pouvez dire use File::FindLib 'my/test/libs';
pour trouver un répertoire de bibliothèque partout au-dessus de votre script dans le chemin.
que votre travail est structuré comme celui-ci:
/home/me/projects/
|- shared/
| |- bin/
| `- lib/
`- ossum-thing/
`- scripts
|- bin/
`- lib/
l'intérieur d'un script dans ossum-thing/scripts/bin
:
use File::FindLib 'lib/';
use File::FindLib 'shared/lib/';
trouverez vos répertoires de bibliothèque et les ajouter à votre @INC
.
Il est également utile de créer un module qui contient tous les paramètres d'environnement nécessaires pour exécuter votre suite d'outils et de le charger dans tous les exécutables de votre projet.
use File::FindLib 'lib/MyEnvironment.pm'
Après de nombreuses tentatives le code qui a finalement fonctionné était de la question que Andomar lié à: utiliser FindBin; # localise ce scriptuse lib "$ FindBin :: Bin/.."; # utiliser le répertoire parent utiliser EPMS; Merci pour votre aide à tous! –
A la vôtre, on dirait que tout le monde lit "répertoire courant" où vous avez écrit "répertoire du module". – Andomar
Après avoir lu http://stackoverflow.com/a/90721/2668831, qui prétend que la méthode FindBin n'est pas robuste pour certaines formes d'organisation Perl modulaire (quelqu'un d'autre peut être en mesure de clarifier) –