2012-03-01 163 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