Je ne sais pas comment faire une chose à Perl et je sens que je fais quelque chose de fondamentalement faux. P>
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. p>
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. P>
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. P>
Comment charger un fichier, relatif du chemin du module? Est-ce encore possible / conseillé? P>
4 Réponses :
Changer votre Module CODE> Appel sur
Exiger le module code> (ou
nécessite un module; module-> Importation (liste) code>). Ensuite, utilisez le débogueur pour parcourir le processus de chargement du module et voir où Perl pense qu'il charge des fichiers de. P>
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
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' );
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
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 em>, 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 p> ou p>