perl 中的相对文件路径

Posted

技术标签:

【中文标题】perl 中的相对文件路径【英文标题】:relative file paths in perl 【发布时间】:2012-03-19 23:03:11 【问题描述】:

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

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

例如我有一个目录结构

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

在 perl 脚本中,我使用代码打开 dataFileToRead.txt 我的 $rawDataName = "../dataFileToRead.txt"; 打开输入,“

如果我从 bin 目录运行 perl 脚本,那么它可以正常工作

如果我从父目录运行它,则无法打开数据文件。

【问题讨论】:

【参考方案1】:

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

use FindBin;

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

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

(顺便说一句,除了非常旧的 perl 之外,最好使用词法文件句柄。)

【讨论】:

@daxim:你的评论大概是 FindBin 坏了的口头禅。我知道这一点,但无法轻易找到解释、与此问题相关的失败示例或替代模块。也许你能帮助我们? 直接链接:FindBin is broken(仅从 2011 年中期开始在核心中修复); FindBin seems to think it's necessary to walk the whole path; code alternative 或者 FindBin::Real 或 lib::abs。我从来没有做过这种比较的愿望,因为我从不需要 FindBin 或等效功能,因为我知道打包和共享目录功能。【参考方案2】:

要将相对路径转换为绝对路径,您可以使用 Cwd :

use Cwd qw(realpath);
print "'$0' is '", realpath($0), "'\n";

【讨论】:

Cwd 的文档目前可在此处获得:search.cpan.org/~smueller/PathTools-3.47/Cwd.pm 我已将 Cwd 文档的路径更新为永久路径:search.cpan.org/dist/PathTools/Cwd.pm 该路径将始终是最新的,即使版本或所有者发生变化。【参考方案3】:

从finding out where the script is开始。

然后获取它所在的目录。你可以使用Path::Class::File的dir()方法。

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

所以,理论上:

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

【讨论】:

【参考方案4】:

相对路径是相对于当前的working directory。如果您对工作目录没有任何控制权,那么您需要找到一种更强大的方法来指定您的文件路径,例如使用绝对路径,或者可能是相对于文件系统中某个特定位置的相对路径。

【讨论】:

以上是关于perl 中的相对文件路径的主要内容,如果未能解决你的问题,请参考以下文章

绝对路径与相对路径

Perl文件目录常用操作

sed 或 Perl 一行 + 如何仅在完全匹配时替换文件中的路径

从 Perl 中的字符串中删除文件扩展名和路径

浅谈nodejs文件操作中的相对路径问题

html中相对路径的问题?