2012-03-01 165 views
6

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

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

比如我有一个目录结构

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

perl脚本我打开dataFileToRead.txt使用的代码 我的$ rawDataName = “../dataFileToRead.txt” 内; open INPUT,“<”,$ rawDataName;

如果我从bin目录运行perl脚本。如果我从父目录运行它,那么就无法打开数据文件,那么它工作正常

回答

13

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

use FindBin; 

则标$FindBin::Bin是你的Perl脚本的位置的绝对路径。您可以chdir有你打开数据文件之前,或者只是用它的路径要打开

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

(顺便说一下这个文件,它始终是更好地使用词法文件句柄上的任何东西,但一。非常老的perl)

+0

https://encrypted.google.com/search?q=findbin+site:use .perl.org – daxim 2012-03-01 13:12:31

+0

@daxim:你的c omment大概是* FindBin被破坏的口头禅*。我知道这一点,但不容易找到一个解释,它与这个问题有关的失败的一个例子,或一个替代模块。也许你可以帮助我们? – Borodin 2012-03-01 14:06:30

+0

直接链接:[FindBin已损坏](http://www.perlmonks.org/?node_id=41213)(自2011年年中以来固定在核心); [FindBin似乎认为有必要走完整个路径](http://use.perl.org/comments.pl?sid=36400&cid=56760); [替代代码](http://use.perl.org/~Aristotle/journal/33996)或者FindBin :: Real或lib :: abs。我从来没有这样做的愿望,因为我不需要FindBin或功能等价物,因为我知道包装和共享目录特征。 – daxim 2012-03-01 15:14:51

0

相对路径相对于当前的working directory。如果您无法控制工作目录,那么您需要找到一种更健壮的方法来强化文件路径,例如使用绝对路径或相对于文件系统中某个特定位置的相对路径。

1

finding out where the script is开始。

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

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

所以,从理论上讲:

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

要打开一个相对路径到绝对的,你可以使用Cwd

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

Cwd的文档目前可以在这里找到:http://search.cpan.org/~smueller/PathTools-3.47/Cwd.pm – 2015-05-11 02:52:29

+1

我已经将Cwd文档的路径更新为永久路径:http:// search .cpan.org/dist/PathTools/Cwd.pm即使版本发生变化,甚至是所有者,该路径也会始终是最新的。 – 2017-02-08 21:22:34