我有一个.pm文件,我们称它为A.pm,我正在另一个文件B.pl中使用该文件,该文件位于单独的目录中。在A.pm中,我想引用一个存在于同一目录中的外部non-perl文件。为了避免硬编码到该外部文件的路径,我想在运行时获取A.pm所在的目录。
我已经尝试使用$ FindBin :: Bin和File :: Spec-> rel2abs('。'),但是我了解到,这些指向您指向当前正在执行 脚本的目录,而不是当前文件。 $ 0也为我提供了当前正在执行的脚本的名称。
除了对A.pm中的路径进行硬编码之外,是否还有一种获取目录A.pm的方法?
编辑:我还应该注意,我尝试仅使用相对于A.pm的路径引用外部文件,但是在执行过程中,代码在B.pl所在的目录中查找外部文件,因此不会也不行。
答案 0 :(得分:6)
__FILE__
返回用于检索正在执行的文件的路径。这意味着您可以使用以下内容:
use File::Basename qw( dirname );
dirname(__FILE__)
如果使用符号链接来加载文件,该操作将失败,因此通常需要先解析符号链接。
use Cwd qw( abs_path );
use File::Basename qw( dirname );
dirname(abs_path(__FILE__))
对于脚本而言,这比对模块而言更为重要,因为用于加载模块的符号链接的几率非常低。
警告:如果自加载模块以来更改了CWD,则这些操作可能会失败。
答案 1 :(得分:3)
如果您已经use
或require
了一个模块,则文件的位置位于%INC
中。
$ perl -MJSON -E 'say $INC{"JSON.pm"}'
/opt/share/perl5/site_perl/5.16/JSON.pm