glob EXPR
glob

在列表上下文中,返回一个(可能为空)的列表,其中包含对 EXPR 值的匹配文件名,类似于 Unix shell Bash 的行为。在标量上下文中,glob 迭代这些匹配文件名,在列表耗尽时返回 undef。如果省略 EXPR,则使用 $_

# List context
my @txt_files  = glob("*.txt");
my @perl_files = glob("*.pl *.pm");

# Scalar context
while (my $file = glob("*.mp3")) {
    # Do stuff
}

Glob 还支持使用 < > 作为分隔符的另一种语法。虽然这种语法得到支持,但建议您使用 glob,因为它更易读且更易于搜索。

my @txt_files  = <"*.txt">;

如果您需要不区分大小写的文件通配符匹配,可以使用 bsd_glob 模块的 :nocase 参数来实现。

    use File::Glob qw(:globally :nocase);

	my @txt = glob("readme*"); # README readme.txt Readme.md

请注意,glob 会根据空格拆分其参数,并将每个段视为单独的模式。因此,glob("*.c *.h") 匹配所有扩展名为 .c.h 的文件。表达式 glob(".* *") 匹配当前工作目录中的所有文件。如果您想通配可能包含空格的文件名,则需要在空格文件名周围使用额外的引号来保护它。例如,要通配文件名中包含 e 后跟空格再跟 f 的文件,可以使用以下方法之一:

my @spacies = <"*e f*">;
my @spacies = glob('"*e f*"');
my @spacies = glob(q("*e f*"));

如果您需要通过变量获取文件名,可以这样做:

my @spacies = glob("'*${var}e f*'");
my @spacies = glob(qq("*${var}e f*"));

如果非空花括号是 glob 中使用的唯一通配符,则不会匹配任何文件名,但可能会返回许多字符串。例如,这将产生九个字符串,每个字符串对应水果和颜色的配对:

my @many = glob("{apple,tomato,cherry}={green,yellow,red}");

此运算符使用标准 File::Glob 扩展实现。有关详细信息,请参阅 bsd_glob,包括 bsd_glob,它不会将空格视为模式分隔符。

如果将glob表达式用作whilefor循环的条件,则它将隐式地赋值给$_。如果将glob表达式或显式地将glob表达式赋值给标量用作while/for条件,则条件实际上测试的是表达式的值是否已定义,而不是其常规的真值。

内部实现细节

这是实现<*.c>运算符的内部函数,但您可以直接使用它。<*.c>运算符在"perlop 中的 I/O 运算符"中进行了更详细的讨论。

可移植性问题:"perlport 中的 glob".