File::Glob - Perl 扩展用于 BSD glob 例程
use File::Glob ':bsd_glob';
@list = bsd_glob('*.[ch]');
$homedir = bsd_glob('~gnat', GLOB_TILDE | GLOB_ERR);
if (GLOB_ERROR) {
# an error occurred reading $homedir
}
## override the core glob (CORE::glob() does this automatically
## by default anyway, since v5.6.0)
use File::Glob ':globally';
my @sources = <*.{c,h,y}>;
## override the core glob, forcing case sensitivity
use File::Glob qw(:globally :case);
my @sources = <*.{c,h,y}>;
## override the core glob forcing case insensitivity
use File::Glob qw(:globally :nocase);
my @sources = <*.{c,h,y}>;
## glob on all files in home directory
use File::Glob ':globally';
my @sources = <~gnat/*>;
glob 尖括号运算符 <>
是一个路径名生成器,它实现了类 Unix shell(如 Bourne shell 或 C shell)使用的文件名模式匹配规则。
File::Glob::bsd_glob() 实现 FreeBSD glob(3) 例程,它是 POSIX glob()(在 IEEE Std 1003.2 "POSIX.2" 中描述)的超集。bsd_glob() 接受一个必需的 pattern
参数和一个可选的 flags
参数,并返回一个匹配模式的文件名列表,模式的解释由 flags
变量修改。
从 v5.6.0 开始,Perl 的 CORE::glob() 是用 bsd_glob() 实现的。请注意,它们没有共享相同的原型 - CORE::glob() 只接受一个参数。由于历史原因,CORE::glob() 还会在其参数上拆分空格,将其视为多个模式,而 bsd_glob() 将它们视为一个模式。但请参阅下面 "导出" 中的 :bsd_glob
。
\ Quote the next metacharacter
[] Character class
{} Multiple pattern
* Match any string of characters
? Match any single character
~ User name home directory
元符号 a{b,c,d}e
是 abe ace ade
的简写。从左到右的顺序被保留,匹配结果在低级别被单独排序以保留此顺序。作为特殊情况,{
、}
和 {}
被原样传递。
另请参阅下面的 "POSIX 标志",它们可以单独导出。
:bsd_glob
:bsd_glob
导出标签导出 bsd_glob() 和下面列出的常量。它还覆盖调用包中的 glob(),使其在空格方面表现得像 bsd_glob()(空格被视为文件名的一部分),但支持在标量上下文中进行迭代;也就是说,它保留了核心函数在每次调用时返回下一个项目的特性。
:glob
:glob
标签现在已不再推荐使用,它是 :bsd_glob
的旧版本。它导出相同的常量和函数,但其 glob() 覆盖不支持迭代;它在标量上下文中返回最后一个文件名。这意味着这将永远循环
use File::Glob ':glob';
while (my $file = <* copy.txt>) {
...
}
bsd_glob
此函数包含在上面列出的两个导出标签中,它接受一个或两个参数。第一个是 glob 模式。第二个(如果给出)是一组按位或运算在一起的标志。可用的标志和默认标志集在下面 "POSIX 标志" 中列出。
请记住,要使用标志的命名常量,您必须导入它们,例如使用上面描述的 :bsd_glob
。如果未导入,并且 use strict
未生效,则常量将被视为裸字字符串,这将无法按您的意愿执行。
:nocase
和 :case
这两个导出标签全局修改 bsd_glob() 和(除 VMS 外)Perl 的内置 glob
运算符使用的默认标志。GLOB_NOCASE
分别被打开或关闭。
csh_glob
csh_glob() 函数也可以导出,但除非您真正了解自己在做什么,否则不应直接使用它。它将模式拆分为单词,并将每个单词提供给 bsd_glob()。Perl 自己的 glob() 函数在内部使用它。
如果没有给出标志参数,则设置 GLOB_CSH
,并且在 VMS 和 Windows 系统上,也设置 GLOB_NOCASE
。否则,要使用的标志完全由标志参数决定。POSIX 定义的标志是
GLOB_ERR
强制 bsd_glob() 在遇到无法打开或读取的目录时返回错误。通常情况下,bsd_glob() 会继续查找匹配项。
GLOB_LIMIT
当模式扩展到大于系统常量 ARG_MAX
(通常在 limits.h 中找到)的大小,使 bsd_glob() 返回错误 (GLOB_NOSPACE)。如果您的系统没有定义此常量,bsd_glob() 将使用 sysconf(_SC_ARG_MAX)
或 _POSIX_ARG_MAX
(按此顺序)。您可以使用标准 POSIX
扩展检查这些值。
GLOB_MARK
每个匹配模式的目录路径名都附加一个斜杠。
GLOB_NOCASE
默认情况下,文件名被认为区分大小写;此标志使 bsd_glob() 将大小写差异视为不重要。
GLOB_NOCHECK
如果模式与任何路径名都不匹配,则 bsd_glob() 返回一个仅包含模式的列表。如果设置了 GLOB_QUOTE
,则其效果存在于返回的模式中。
GLOB_NOSORT
默认情况下,路径名按升序 ASCII 顺序排序;此标志阻止排序(加快 bsd_glob() 的速度)。
FreeBSD 对 POSIX 标准的扩展是以下标志
GLOB_BRACE
预处理字符串以扩展 {pat,pat,...}
字符串,类似于 csh(1)。出于历史原因,模式 '{}' 保持未扩展(csh(1) 也执行相同的操作以简化 find(1) 模式输入)。
GLOB_NOMAGIC
与 GLOB_NOCHECK
相同,但它仅在模式不包含任何特殊字符 "*", "?" 或 "[" 时才返回模式。NOMAGIC
用于简化实现历史 csh(1) glob 行为,可能不应该在其他地方使用。
GLOB_QUOTE
使用反斜杠 ('\') 字符进行引用:模式中每个反斜杠后跟一个字符都将被该字符替换,避免对该字符进行任何特殊解释。(但请参阅下面关于 DOSISH 系统的例外情况)。
GLOB_TILDE
将以 '~' 开头的模式扩展到用户名主目录。
GLOB_CSH
为了方便起见,GLOB_CSH
是 GLOB_BRACE | GLOB_NOMAGIC | GLOB_QUOTE | GLOB_TILDE | GLOB_ALPHASORT
的同义词。
POSIX 提供的 GLOB_APPEND
、GLOB_DOOFFS
以及 FreeBSD 扩展 GLOB_ALTDIRFUNC
和 GLOB_MAGCHAR
标志在 Perl 版本中未实现,因为它们涉及与底层 C 结构的更复杂交互。
以下标志已在 Perl 实现中添加,用于 csh 兼容性
GLOB_ALPHASORT
如果GLOB_NOSORT
没有生效,则按字母顺序(不区分大小写)对文件名进行排序,而不是按 ASCII 顺序排序。
bsd_glob() 返回一个匹配路径列表,可能为空。如果发生错误,&File::Glob::GLOB_ERROR 将不为零,并且$!
将被设置。如果未发生错误,则保证 &File::Glob::GLOB_ERROR 为零,否则为以下值之一
在 bsd_glob() 找到一些匹配路径但被错误中断的情况下,它将返回一个文件名列表以及设置 &File::Glob::ERROR。
请注意,bsd_glob() 与 POSIX 和 FreeBSD glob(3) 的行为不同,它不将ENOENT
和ENOTDIR
视为错误 - bsd_glob() 将继续处理这些错误,除非设置了GLOB_ERR
标志。
请注意,从 File::Glob 返回的所有文件名都是被污染的。
如果您想使用多个模式,例如bsd_glob("a* b*")
,您可能应该将它们放入一个集合中,例如bsd_glob("{a*,b*}")
。这是因为 bsd_glob() 的参数不会被 C shell 解析。请记住,您可以使用反斜杠来转义字符。
在 DOSISH 系统上,反斜杠是有效的目录分隔符字符。在这种情况下,使用反斜杠作为引用字符(通过 GLOB_QUOTE)会干扰使用反斜杠作为目录分隔符。最好的(最简单、最便携)解决方案是使用正斜杠作为目录分隔符,使用反斜杠作为引用字符。但是,这与这些系统上的“正常做法”不符。因此,为了让用户习惯,反斜杠(在 GLOB_QUOTE 下)只引用 glob 元字符 '[', ']', '{', '}', '-', '~' 和反斜杠本身。所有其他反斜杠都将原样传递。
Win32 用户应该使用真正的斜杠。如果您真的想使用反斜杠,请考虑使用 Sarathy 的 File::DosGlob,它随标准 Perl 发行版一起提供。
"glob" in perlfunc, glob(3)
Perl 接口由 Nathan Torkington <[email protected]> 编写,并根据艺术许可证发布。Greg Bacon <[email protected]>、Gurusamy Sarathy <[email protected]> 和 Thomas Wegner <[email protected]> 对其进行了进一步的修改。C glob 代码具有以下版权
版权所有 (c) 1989, 1993 加州大学董事会。保留所有权利。
此代码源自 Guido van Rossum 贡献给伯克利的软件。
在满足以下条件的情况下,允许以源代码和二进制形式重新分发和使用此软件,无论是否修改。
源代码的重新分发必须保留上述版权声明、此条件列表和以下免责声明。
二进制形式的重新分发必须在随分发提供的文档和/或其他材料中复制上述版权声明、此条件列表和以下免责声明。
未经事先明确书面许可,不得使用大学的名称或其贡献者的名称来认可或推广源自此软件的产品。
此软件由董事会和贡献者“按现状”提供,任何明示或暗示的保证,包括但不限于对适销性和特定用途适用性的暗示保证,均被免除。在任何情况下,董事会或贡献者均不对因使用此软件而造成的任何直接、间接、附带、特殊、惩罚性或后果性损害(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断)负责,无论其责任理论如何,无论是合同、严格责任还是侵权行为(包括疏忽或其他原因),即使已被告知可能发生此类损害。