我正在创建自己的模块,让我们称之为X::Y
。当然,模块会在文件中X/Y.pm
。
假设Y
需要调用外部程序,prog
. 理想情况下,我只想投入prog
进去X
,这样我就可以跑步了X/prog
。我希望没有硬编码X/prog
的完整路径,并且无论当前工作目录集如何,模块都能正常工作。
如何从模块内部找到模块的完整路径?还是有更好的方法来做到这一点?
我正在创建自己的模块,让我们称之为X::Y
。当然,模块会在文件中X/Y.pm
。
假设Y
需要调用外部程序,prog
. 理想情况下,我只想投入prog
进去X
,这样我就可以跑步了X/prog
。我希望没有硬编码X/prog
的完整路径,并且无论当前工作目录集如何,模块都能正常工作。
如何从模块内部找到模块的完整路径?还是有更好的方法来做到这一点?
当前正在执行的源文件的完整路径由 Perl 的__FILE__
特殊文字提供。
但是,我希望看到外部程序安装在通常的位置,并且那里的路径要么在 Perl 代码中编码为常量,要么包含在PATH
环境变量中。
Borodin 回答了这个问题,但提供了一些相关信息:
FindBin - 查找运行脚本的目录(在脚本本身或由它加载的包中使用)
Neil Bower 的用于获取模块路径的 CPAN 模块- 详细查看模块以查找另一个模块的路径。
一旦加载了一个模块,它的路径就在全局%INC
变量中。要查找它,您需要进行简单的转换:
::
将包名称更改为/
.pm
因此,要查找模块的位置X::Y
,您需要查看$INC{"X/Y.pm"}
.