目錄

名稱

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::Specsplitpath()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 語法規則。

另請參閱

dirname(1)basename(1)File::Spec