有没有办法在运行时获取当前(当前未执行)文件的目录?

Jon*_*n G 2 perl

我有一个.pm文件,让我们称之为A.pm,我在另一个文件B.pl中使用它,它存在于一个单独的目录中.在A.pm中,我想引用存在于同一目录中的外部非perl文件.为了避免硬编码该外部文件的路径,我想获得A.pm在运行时生活的目录.

我尝试过使用$ FindBin :: Bin和File :: Spec-> rel2abs('.'),但我了解到那些指向当前正在执行的脚本的目录,而不是当前文件.$ 0也为我提供了当前正在执行的脚本的名称.

有没有办法获得目录A.pm除了在A.pm的硬编码路径之外生活?

编辑:我还应该注意,我已经尝试仅使用相对于A.pm的路径引用外部文件,但在执行期间,代码在B.pl所在的目录中查找外部文件,因此这也不起作用.

ike*_*ami 6

__FILE__返回用于检索正在执行的文件的路径.这意味着您可以使用以下内容:

use File::Basename qw( dirname );

dirname(__FILE__)
Run Code Online (Sandbox Code Playgroud)

如果使用符号链接加载文件,那将失败,因此通常首先想要解析符号链接.

use Cwd            qw( abs_path );
use File::Basename qw( dirname );

dirname(abs_path(__FILE__))
Run Code Online (Sandbox Code Playgroud)

这对于脚本比对模块更重要,因为用于加载模块的符号链接的几率非常低.

警告:如果自模块加载后CWD发生更改,这些可能会失败.

  • @Grinnz,如果您将两个文件安装到同一目录(或相对目录)中,则Dir :: Self和lib :: relative用于查找相邻文件的方法将不会总是找到该文件。我肯定会打电话说找不到您想要查找的文件-更糟糕的是,找到了错误的文件-一个错误。不仅是错误,还可能是主要的安全漏洞!(这就是为什么`.`不再在@INC中的原因。) (2认同)