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"),则后缀移除的模式匹配将不区分大小写进行,因为这些系统在打开现有文件时不区分大小写。
您可以保证 $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()
中相同,只是所有正则表达式元字符都被引用。
# 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()
不会剥离与文件名中剩余字符相同的后缀。
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 语法规则。