如何加载相对于模块路径下的文件?(How do I load a file relative to

2019-07-19 02:33发布

我不知道该怎么做一件事的Perl和我觉得我做的事情基本上是错误的。

我在做一个大项目,所以我分裂任务分为不同模块。 我把模块到项目目录,在“模块/”子目录,这个目录添加到PERL5LIB和PERLLIB。

所有这些模块使用一些配置,保存在主项目目录外部文件 - “../configure.yaml”如果你看它从模块文件的观点。

但是,现在,当我通过使用模块“使用”,模块中的所有相对路径被当作使用这些模块的脚本的当前目录,而不是从模块本身的目录。 甚至当我使用FindBin或任何东西。

如何加载一个文件,从模块的相对路径? 是,甚至有可能/最好?

Answer 1:

其中模块从在%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之间的目录,所以要小心。



Answer 2:

有一个叫模块文件:: 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!


Answer 3:

全局%INC表包含你拥有的每模块的入口use “d或require ” d,与Perl中发现该模块的位置有关。

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

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

那是更有帮助?



Answer 4:

改变你use Module调用require Module (或require Module; Module->import(LIST) 然后使用调试器来逐步通过模块加载过程,看看那里的Perl认为它是从加载的文件。



文章来源: How do I load a file relative to a module path?