perl - 如何在 perl 中添加库的相对路径?
问题描述
我想要一个库(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”上使用它们时,这两个建议的选项不起作用。
解决方案
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';
我建议__FILE__
在所有情况下都使用比 FindBin 更简单的方法 - FindBin 是远距离操作,需要变通方法,并且在旧 Perls 上有严重的错误,因为它在 CPAN 上不可用而无法修复。
推荐阅读
- office-ui-fabric - Fluent/Fabric - 是否可以以编程方式清除 NormalPeoplePicker 的输入?
- java - 如何使多个 nbm 模块的 jar 状态相同?
- python - 将变量打印到 txt 文件
- java - Spring Boot - 具有来自外部来源的属性的 ConditionalOnExpression
- c# - 即使使用 FirstOrDefault 的位置,EF 也会加载所有子项
- javascript - 如何为whatsapp之类的通知实现声音?
- regex - 正则表达式还添加符号
- excel - VBA Excel - 查找某一列并将其移动到 Excel 中另一列之前的列
- python - 用漂亮的汤(python)按类搜索不起作用
- memory-leaks - Swift Combine - zip 运算符是否保留它没有机会发布的所有值?