我不知道该怎么做一件事的Perl和我觉得我做的事情基本上是错误的。
我在做一个大项目,所以我分裂任务分为不同模块。 我把模块到项目目录,在“模块/”子目录,这个目录添加到PERL5LIB和PERLLIB。
所有这些模块使用一些配置,保存在主项目目录外部文件 - “../configure.yaml”如果你看它从模块文件的观点。
但是,现在,当我通过使用模块“使用”,模块中的所有相对路径被当作使用这些模块的脚本的当前目录,而不是从模块本身的目录。 甚至当我使用FindBin或任何东西。
如何加载一个文件,从模块的相对路径? 是,甚至有可能/最好?
其中模块从在%INC散列加载的Perl商店。 您可以加载到的东西相对的:
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' );
%INC的关键是基于对::严格的平移/与.pm后缀附加,即使是在Windows,VMS等。
请注意,如果你把相对目录在@INC在%INC的值可以是相对于当前目录下,如果你改变了要求/用途和检查%INC之间的目录,所以要小心。
有一个叫模块文件:: SHAREDIR存在解决这个问题。 你在正确的轨道试图FindBin,但FindBin总能找到正在运行的程序 ,而不是一个使用它的模块。 SHAREDIR确实神似YSTH的解决方案的东西,除了一个漂亮的界面包裹起来。
用法就是这么简单
my $filename = File::ShareDir::module_file(__PACKAGE__,
'my/data.txt');
# and then open $filename or whatever else.
要么
my $dirname = File::ShareDir::module_dir(__PACKAGE__);
# Play ball!
全局%INC
表包含你拥有的每模块的入口use
“d或require
” d,与Perl中发现该模块的位置有关。
use YAML;
print $INC{"YAML.pm"};
>> /usr/lib/perl5/site_perl/5.8/YAML.pm
那是更有帮助?
改变你use Module
调用require Module
(或require Module; Module->import(LIST)
然后使用调试器来逐步通过模块加载过程,看看那里的Perl认为它是从加载的文件。