2013-10-31 117 views
0

我用Perl工作,有一個文件保存在目錄中,像這樣:獲取目錄

/root/dir_1/dir_2/dir_3/dir_4/perl_file.pl 

我試圖從perl的文件本身做的是得到/root ... dir_4/字符串或只需dir_4/,然後我可以使用它來創建另一個目錄(我可以使用特定的模式來創建新目錄)。

我一直在尋找的文件::複製和文件::基名,這似乎需要你指定的路徑,但我想根據所運行的文件我的路徑是可變的。這似乎很簡單,可能是我只是俯視,但這可能嗎?

在僞代碼,我在尋找類似my $dir = UpOneDirectory(thisperlfile) or FilePath(thisperlfile)

回答

5
use FindBin qw($RealBin); 
say $RealBin; 
+0

我討厭FinBin _works_。我不喜歡導出的變量。如果它使用函數,我會。 –

+2

@David W.默認情況下不會導出。您可以隨時使用'$ FindBin :: RealBin'。你也可以提交一個補丁,添加'sub RealBin {$ RealBin}' – ikegami

+0

這實際上就是我所做的。我不輸出變量。 –

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

my $dir = dirname(abs_path($0)); 
+0

擺脫中間人:'我的$ dir = dirname(abs_path($ 0));' – toolic

+0

@toolic謝謝您的評論。更新了ans。有時我會使用稀疏語句來提高代碼的可讀性。 – jkshah

0

...或...如果你不想依賴外部模塊,你可以這樣做用一個行正則表達式替換:

(my $me = $0) =~ s#(^/.*?)/?[^/]*$#\1#; 

這將分配一個字符串值$me代表該路徑包含當前腳本的目錄。

這是它的工作原理。 $ 0包含當前正在執行的腳本的路徑。我們想把它賦給$me,但我們也想用正則表達式替換來操作它,所以我們把賦值放在括號內(注意,「我的」聲明也必須進入parens(或perl將barf))。

正則表達式匹配最初的'/',後面跟着所有字符到最後的'/',然後是所有非'/'字符到字符串末尾(注意:正則表達式使用'^' '和'$')。然後使用分組集來替換最後的(/不包括)最終的'/'作爲新的字符串值。 IOW:路徑的目錄組件。

另外請注意,所有這些額外的絨毛只是爲了處理文件駐留在根目錄中的情況,我們希望結果實際上是'/'(而不是'')。如果我們沒有需要覆蓋這種情況下,正則表達式可能是更簡單的,就像這樣:

(my $me = $0) =~ s#/[^/]*$##; # DON'T USE THIS ONE (Use the above example instead) 

...但是,這並不涵蓋所有的基礎。