如何在Perl中向库添加相对路径?

时间:2019-06-25 10:02:33

标签: perl declaration relative-path

我想拥有一个库(my_library_1),该库可以利用文件夹中与自身相关的另一个库。如果我这样写:

use lib "/./libraries/";
use my_library_2;

它将使用我执行脚本的路径。

如果我按照其他类似问题提出的建议使用以下内容:

use FindBin;
use lib "$FindBin::Bin/./libraries/";
use my_library_2;

这将相对于正在执行的主脚本,因此,如果我从另一个脚本调用此库,然后此库调用另一个(my_library_1),则第一个库的库声明将与预期不符(my_library_1)和主脚本位于同一文件夹中。

如何在不依赖绝对路径的情况下解决此问题?

编辑:添加更多信息 这是当前的结构:

folder
\_folder_1
 \__main_script
\_folder_2
 \__my_library_1
 \__folder_1
   \___my_library_2

我想使用相对路径从library_2引用library_3。当我在“ my_library_2”上使用这两个建议的选项时,它们不起作用。

2 个答案:

答案 0 :(得分:1)

lib::relative是使用__FILE__添加相对于脚本或模块的绝对lib路径的直接方法。它还记录了等效的核心模块命令,因此无需安装。

在脚本中:

use lib::relative '../folder2';

或:

use Cwd ();
use File::Basename ();
use File::Spec ();
use lib File::Spec->catdir(File::Basename::dirname(Cwd::abs_path __FILE__), '../folder2');

类似地在模块中:

use lib::relative 'folder1';

在所有情况下,我都建议在FindBin上使用一种更为简单的__FILE__方法-FindBin远距离操作,需要变通方法,并且在旧的Perls上存在严重的错误,因为it isn't available on CPAN无法解决。

答案 1 :(得分:0)

这是使用__FILE__来获取目录名my_library_1.pm的一种方法:

folder1 / main.pl

use strict;
use warnings;
use FindBin;

use lib "$FindBin::RealBin/../folder2/";
use my_library_1;

folder2 / my_library_1.pm

package my_library_1;
use strict;
use warnings;
use File::Basename qw(dirname);

my $dir;
BEGIN {
    $dir = dirname(__FILE__);
}
use lib "$dir/folder1";
use my_library_2;