59 votes

Comment utiliser un module Perl dans un répertoire qui n'est pas dans @INC?

J'ai un module dans le répertoire parent de mon script et j'aimerais le "l'utiliser".

Si je fais

 use '../Foo.pm';
 

Je reçois des erreurs de syntaxe.

J'ai essayé de faire:

 push @INC, '..';
use EPMS;
 

et .. apparemment ne se présente pas dans @INC

Je deviens fou! Quel est le problème ici?

104voto

ephemient Points 87003

use a lieu au moment de la compilation, donc ceci fonctionnerait:

 BEGIN {push @INC, '..'}
use EPMS;
 

Mais la meilleure solution est de use lib , ce qui est une façon plus agréable d’écrire ce qui précède:

 use lib '..';
use EPMS;
 

Si vous utilisez un autre répertoire, l'utilisation de FindBin est recommandée:

 use FindBin;                 # locate this script
use lib "$FindBin::Bin/..";  # use the parent directory
use EPMS;
 

23voto

brian d foy Points 71781

Il ya plusieurs façons que vous pouvez modifier @INC.

  • ensemble PERL5LIB, comme documenté dans perlrun

  • utilisez le commutateur-I sur la ligne de commande, également documenté dans perlrun. Vous pouvez également appliquer automatiquement avec PERL5OPT, mais il suffit d'utiliser PERL5LIB si vous vous apprêtez à faire.

  • use lib à l'intérieur de votre programme, même si c'est fragile, car une autre personne sur un autre ordinateur peut avoir dans un autre répertoire.

  • Modifier manuellement @INC, vous assurant de le faire au moment de la compilation, si vous voulez tirer dans un module avec l'usage. C'est trop de travail même si.

13voto

Berserk Points 297

Personnellement, je préfère garder mes modules (ceux que j'écris pour moi-même ou pour des systèmes que je peux contrôler) dans un certain répertoire, ainsi que pour les placer dans un sous-répertoire. Un péché:

 /www/modules/MyMods/Foo.pm
/www/modules/MyMods/Bar.pm
 

Et puis où je les utilise:

 use lib qw(/www/modules);
use MyMods::Foo;
use MyMods::Bar;
 

En passant… quand il s'agit de pousser, je préfère la virgule grosse flèche:

 push @array => $pushee;
 

Mais c'est juste une question de préférence.

8voto

zigdon Points 8753

"utiliser la lib' est la réponse, comme @ephemient mentionné plus tôt. Une autre option est l'utilisation d'exiger ou d'importation au lieu d'utilisation. Cela signifie que le module ne serait pas chargée au moment de la compilation, mais au lieu de l'exécution.

Qui vous permettra de modifier @INC que vous avez essayé, ou vous pourriez passer nécessitent un chemin d'accès vers le fichier au lieu du nom du module. De "perldoc -f exigent":

Si EXPR est un mot nu, le besoin suppose un ".h" extension et remplace "::" avec des "/" dans le nom de fichier pour vous, pour le rendre facile pour charger des modules standard. Cette forme de chargement de modules ne risque pas de la modification de votre espace de noms.

3voto

Jonathan Leffler Points 299946

Vous devez avoir les push traités avant que les use soient - et use traités tôt. Donc, vous aurez besoin de BEGIN { push @INC, ".."; } pour avoir une chance, je crois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X