在列表上下文中,返回一个(可能为空)的列表,其中包含对 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
表达式用作while
或for
循环的条件,则它将隐式地赋值给$_
。如果将glob
表达式或显式地将glob
表达式赋值给标量用作while
/for
条件,则条件实际上测试的是表达式的值是否已定义,而不是其常规的真值。
内部实现细节
这是实现<*.c>
运算符的内部函数,但您可以直接使用它。<*.c>
运算符在"perlop 中的 I/O 运算符"中进行了更详细的讨论。
可移植性问题:"perlport 中的 glob".