perl缺失的一個小功能normalize path

我在處理strace輸出的log時,遇到一個問題,log中記錄的打開的文件名
"../../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;
}


發佈了137 篇原創文章 · 獲贊 16 · 訪問量 49萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章