我想拥有一个库(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”上使用这两个建议的选项时,它们不起作用。
答案 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;