File::Basename - 將檔案路徑剖析成目錄、檔名和字尾。
use File::Basename;
my ($name, $path, $suffix) = fileparse($fullname, @suffixlist);
my $name = fileparse($fullname, @suffixlist);
my $basename = basename($fullname, @suffixlist);
my $dirname = dirname($fullname);
這些常式讓您可以將檔案路徑剖析成目錄、檔名和字尾。
注意:dirname()
和 basename()
模仿同名 shell 和 C 函式的行為和怪癖。請參閱各函式的文件以取得詳細資訊。如果您只關心剖析路徑,使用 File::Spec 的 splitpath()
和 splitdir()
方法會更安全。
保證
# Where $path_separator is / for Unix, \ for Windows, etc...
dirname($path) . $path_separator . basename($path);
對於所有系統(除了 VMS)都等於原始路徑。
fileparse
my($filename, $dirs, $suffix) = fileparse($path);
my($filename, $dirs, $suffix) = fileparse($path, @suffixes);
my $filename = fileparse($path, @suffixes);
fileparse()
常式將檔案路徑分為 $dirs、$filename 和(選擇性)檔名 $suffix。
$dirs 包含 $path 中最後一個目錄分隔符號(包括磁碟區(如果適用))之前的所有內容。$path 的其餘部分是 $filename。
# On Unix returns ("baz", "/foo/bar/", "")
fileparse("/foo/bar/baz");
# On Windows returns ("baz", 'C:\foo\bar\', "")
fileparse('C:\foo\bar\baz');
# On Unix returns ("", "/foo/bar/baz/", "")
fileparse("/foo/bar/baz/");
如果給定 @suffixes,每個元素都是一個模式(字串或 qr//
),與 $filename 的結尾相符。相符的部分會被移除,並成為 $suffix。
# On Unix returns ("baz", "/foo/bar/", ".txt")
fileparse("/foo/bar/baz.txt", qr/\.[^.]*/);
如果類型是非 Unix(請參閱 "fileparse_set_fstype"),則移除 suffix 的模式比對會不分大小寫,因為這些系統在開啟現有檔案時不區分大小寫。
保證 $dirs . $filename . $suffix
會表示與原始 $path 相同的位置。
basename
my $filename = basename($path);
my $filename = basename($path, @suffixes);
提供此函式是為了與 Unix shell 指令 basename(1)
相容。它不會總是傳回路徑的檔案名稱部分,就像您預期的那樣。為了安全起見,如果您想要路徑的檔案名稱部分,請使用 fileparse()
。
basename()
會傳回檔案路徑的最後一層,即使最後一層明顯是目錄。實際上,它對路徑的作用就像 pop()
。這與 fileparse()
的行為不同。
# Both return "bar"
basename("/foo/bar");
basename("/foo/bar/");
@suffixes 的作用與 fileparse()
中相同,但所有 regex 元字元都已加上引號。
# These two function calls are equivalent.
my $filename = basename("/foo/bar/baz.txt", ".txt");
my $filename = fileparse("/foo/bar/baz.txt", qr/\Q.txt\E/);
另外請注意,為了與 shell 指令相容,如果 basename()
與檔案名稱中剩餘的字元相同,則不會移除 suffix。
dirname
提供此函式是為了與 Unix shell 指令 dirname(1)
相容,並繼承了它的部分怪癖。儘管它的名稱,但它不會總是傳回目錄名稱,就像您預期的那樣。為了安全起見,如果您想要路徑的目錄名稱,請使用 fileparse()
。
只有在 VMS(路徑的檔案和目錄部分之間沒有歧義)和 AmigaOS(可能是由於此模組中的實作怪癖)中,dirname()
才會像 fileparse($path)
一樣運作,只傳回 $dirs。
# On VMS and AmigaOS
my $dirs = dirname($path);
在使用 Unix 或 MSDOS 語法時,它會模擬 dirname(1)
shell 函式,與 fileparse()
的運作方式略有不同。它會傳回檔案路徑的所有部分,除了最後一層,即使最後一層明顯是目錄。實際上,它不會傳回目錄部分,而只是傳回高一層的路徑,對檔案路徑的作用就像 chop()
。
另外,與 fileparse()
不同,dirname()
傳回的路徑中不包含尾斜線。
# returns /foo/bar. fileparse() would return /foo/bar/
dirname("/foo/bar/baz");
# also returns /foo/bar despite the fact that baz is clearly a
# directory. fileparse() would return /foo/bar/baz/
dirname("/foo/bar/baz/");
# returns '.'. fileparse() would return 'foo/'
dirname("foo/");
在 VMS 中,如果 $path 中沒有目錄資訊,則會使用目前的預設裝置和目錄。
fileparse_set_fstype
my $type = fileparse_set_fstype();
my $previous_type = fileparse_set_fstype($type);
通常 File::Basename 會假設檔案路徑類型為您目前作業系統的原生類型(例如 Unix 上的 /foo/bar 風格,Windows 上的 \foo\bar 等)。使用此函式,您可以覆寫此假設。
有效的 $types 為「MacOS」、「VMS」、「AmigaOS」、「OS2」、「RISCOS」、「MSWin32」、「DOS」(也為了向後相容性而有「MSDOS」),「Epoc」和「Unix」(所有大小寫不敏感)。如果給定一個無法辨識的 $type,則會假設為「Unix」。
如果您已選取 VMS 語法,而您傳遞給這些常式之一的檔案規格包含「/」,則它們會假設您正在使用 Unix 模擬,並僅針對該函式呼叫套用 Unix 語法規則。