内容

名称

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"),则后缀移除的模式匹配将不区分大小写进行,因为这些系统在打开现有文件时不区分大小写。

您可以保证 $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 语法规则。

另请参阅

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