2011-07-05 141 views
1

我有一個任務,我需要連接2個路徑名:絕對+相對在Perl中。下面介紹我想實現:如何連接路徑名和相對路徑名?

dir1/dir2/dir3/ + ../filename => dir1/dir2/filename 
dir1/dir2/dir3/ + ../../filename => dir1/filename 

我已經在相對路徑計算「」唯一的解決辦法,比如X,然後分割的絕對路徑到迪爾斯和盡數 - Y和最後只有串接YX dirs與文件名。這看起來太笨重了,我想知道是否存在更好的解決方案(我確信它的確存在)。先謝謝你。

+0

也許[文件::規格:: rel2abs](http://perldoc.perl.org/File/Spec.html)與[文件::基名](HTTP組合://perldoc.perl .org/File/Basename.html)會有幫助嗎? – fnokke

+0

其實我的任務是連接兩個URL,這就是爲什麼我沒有注意到File :: Spec也適用於這種情況。在您的評論之後,我查看了File :: Spec並與bvr同時找到了解決方案。謝謝 – pmod

回答

1
$ perl -MURI -E'say URI->new($ARGV[1])->abs($ARGV[0]);' \ 
    http://foo.com/dir1/dir2/dir3/ ../filename 
http://foo.com/dir1/dir2/filename 

$ perl -MURI -E'say URI->new($ARGV[1])->abs($ARGV[0]);' \ 
    http://foo.com/dir1/dir2/dir3/ ../../filename 
http://foo.com/dir1/filename 

它甚至喜歡你的那些兩次相對URLS工作。

$ perl -MURI -E'say URI->new($ARGV[1])->abs($ARGV[0]);' \ 
    /dir1/dir2/dir3/ ../filename 
/dir1/dir2/filename 

$ perl -MURI -E'say URI->new($ARGV[1])->abs($ARGV[0]);' \ 
    /dir1/dir2/dir3/ ../../filename 
/dir1/filename 
+0

'URI-> new($ ARGV [1]) - > abs($ ARGV [0])'也可以寫成URI-> new_abs($ ARGV [1],$ ARGV [0])''。 – ikegami

4

你可以看一下File::Spec,即catdir方法:

use File::Spec; 

print File::Spec->catdir('dir1/dir2/dir3', '../filename'),"\n"; 
print File::Spec->catdir('dir1/dir2/dir3', '../../filename',),"\n"; 
+0

謝謝。然而File :: Spec-> catdir()在我的情況下有點過分,因爲它將路徑中的路徑分隔符更改爲系統路徑,但我需要保留原始路徑。但這並不難以添加轉換。 – pmod

+0

@pmod - 請注意,您也可以使用[File :: Spec :: Unix](http://search.cpan.org/perldoc?File::Spec::Unix)等特定系統實現來獲得期望的分隔符。不過,我不知道會不會保留參數中使用的那些參數。 – bvr

+1

File :: Spec(:: Unix)不會產生所需的效果。它生成'dir1/dir2/dir3 /../ filename',因爲'dir1/dir2/filename'不一定等同。 (想象符號鏈接。) – ikegami