10
votes

Comment charger un fichier par rapport à un chemin de module?

Je ne sais pas comment faire une chose à Perl et je sens que je fais quelque chose de fondamentalement faux.

Je fais un projet plus important, alors j'ai divisé la tâche en différents modules. Je mets les modules dans le répertoire de projet, dans le sous-répertoire "Modules /" et ajouté ce répertoire à Perl5Lib and Perllib.

Tous ces modules utilisent une certaine configuration, enregistrée dans un fichier externe dans le répertoire principal du projet - "../configure.yaml" Si vous le regardez à partir du point de vue du fichier de module.

Mais, en ce moment, lorsque j'utilise le module via "Utiliser", tous les chemins relatifs du module sont pris à partir du répertoire actuel du script à l'aide de ces modules, et non du répertoire du module lui-même. Pas même quand j'utilise Findbin ou quoi que ce soit.

Comment charger un fichier, relatif du chemin du module? Est-ce encore possible / conseillé?


0 commentaires

4 Réponses :


-4
votes

Changer votre Module Appel sur Exiger le module (ou nécessite un module; module-> Importation (liste) ). Ensuite, utilisez le débogueur pour parcourir le processus de chargement du module et voir où Perl pense qu'il charge des fichiers de.


1 commentaires

Eh bien, je ne pense pas qu'il y ait un bug dans mon programme - je ne sais tout simplement pas comment l'écrire :) Si j'écris, par exemple, LoaderFile ("../ configure.yaml"); Dans le module, et j'utilise ce module dans un script ailleurs, Perl simplement l'utiliser comme chemin relatif dans le fichier de script, et non le fichier de module. Exiger ou déboguer ne contribue pas vraiment, je sais où le problème est, je ne sais juste pas quoi faire avec elle



14
votes

Les magasins PERL où les modules sont chargés dans le hachage% inc. Vous pouvez charger les choses relatifs à cela:

package Module::Foo;
use File::Spec;
use strict;
use warnings;

my ($volume, $directory) = File::Spec->splitpath( $INC{'Module/Foo.pm'} );
my $config_file = File::Spec->catpath( $volume, $directory, '../configure.yaml' );


0 commentaires

8
votes

Le tableau global % Inc code> contient une entrée de chaque module que vous avez Utiliser code> 'd ou nécessite code>' D, associé à l'endroit qui Perl a trouvé ce module.

use YAML;
print $INC{"YAML.pm"};

>> /usr/lib/perl5/site_perl/5.8/YAML.pm


0 commentaires

8
votes

Il y a un module appelé Fichier :: Sharedir qui existe pour résoudre ce problème. Vous étiez sur la bonne voie essayant Findbin, mais Findbin trouve toujours le programme le programme , pas le module qui l'utilise. Sharedir fait quelque chose de très semblable à la solution de YSTH, sauf enveloppé dans une interface agréable.

L'utilisation est aussi simple que xxx

ou xxx < / pré>


0 commentaires