"../../c/../m"
是這樣的,其中c是一個symbolic link。我期望它能轉換爲絕對路徑,但是不要幫我翻譯symbolic link。就這個小功能,可是讓我嘗試了好幾天。說到這裏,可能很多會想abs_path()不就行了麼。錯!abs_path()會真正的訪問文件系統,所以會將symbolic link轉成真正的文件。這樣的結果不是我要的。
最終鎖定在
File::Spec->rel2abs()
這個函數,可是你會發現,他只能幫你轉換爲“/v/c/../m”
這個函數並不會真正去訪問文件系統,只是把開頭的..轉換爲絕對路徑的開頭。
餘下的工作,我還得把路徑中間的..也去掉。沒有任何現成函數可以使用,所以我自己實現了一個。
=item normalizefilepath
Description:
normalize file path
/v/c/../m -> /v/m
Parameter:
@file path string
Return:
normalized path
=cut
sub normalizefilepath {
my $path = shift;
my $newpath;
do {
$newpath = $path;
$path =~ s|[^/][^/]*\/\.\.\/||;
} while $newpath ne $path;
return $newpath;
}