Perl 中的相对文件路径

8

我有一个使用相对文件路径的Perl脚本。

相对路径似乎是相对于执行脚本的位置而不是Perl脚本的位置。我该如何使我的相对路径相对于脚本的位置?

例如,我有一个目录结构

dataFileToRead.txt
->bin
  myPerlScript.pl
->output

在Perl脚本中,我使用以下代码打开数据文件dataFileToRead.txt: my $rawDataName = "../dataFileToRead.txt"; open INPUT, "<", $rawDataName;
如果我从bin目录运行Perl脚本,则可以正常工作。
如果我从父目录运行它,则无法打开数据文件。
4个回答

15

FindBin是解决您问题的经典方案。如果您编写的代码

use FindBin;

如果使用 $FindBin::Bin 标量,则可以获得 Perl 脚本所在位置的绝对路径。您可以在打开数据文件之前在那里使用 chdir,或者只是在要打开的文件路径中使用它。

my $rawDataName = "$FindBin::Bin/../dataFileToRead.txt";
open my $in, "<", $rawDataName;

(顺便说一句,除非是非常老的 Perl 版本,否则最好使用词法文件句柄。)


@daxim:你的评论可能是“FindBin已损坏”的口头禅。我知道这一点,但很难找到一个解释,一个与此问题相关的失败示例或替代模块。也许你能帮助我们? - Borodin
直接链接:FindBin is broken(自2011年中期以来已在核心中修复); FindBin似乎认为有必要遍历整个路径; 代码替代方案,或者使用FindBin::Real或lib::abs。我从未有过这样的比较欲望,因为我从未需要FindBin或功能等效,因为我知道如何打包和共享目录功能。 - daxim

3
为了将相对路径转换为绝对路径,您可以使用 Cwd
use Cwd qw(realpath);
print "'$0' is '", realpath($0), "'\n";

Cwd的文档目前可以在这里找到:http://search.cpan.org/~smueller/PathTools-3.47/Cwd.pm - Jean-Francois T.
2
我已将Cwd文档的路径更新为永久路径:http://search.cpan.org/dist/PathTools/Cwd.pm。即使版本更改或所有者更改,该路径始终是最新的。 - Andy Lester

1

首先找出脚本所在的位置

然后获取它所在的目录。您可以使用Path::Class::Filedir()方法来实现这一点。

最后,您可以使用chdir将当前工作目录更改为刚刚确定的目录。

因此,理论上:

chdir(Path::Class::File->new(abs_path($0))->dir());

0

相对路径是相对于当前工作目录的。如果您无法控制工作目录,则需要找到更强大的指定文件路径的方法,例如使用绝对路径,或者可能是相对于文件系统中某个特定位置的相对路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接