为什么glob lstat匹配条目?

pil*_*row 7 linux perl glob

这个问题中查看行为,我很惊讶地看到perl lstat()的每个路径都与glob模式匹配:

$ mkdir dir
$ touch dir/{foo,bar,baz}.txt  
$ strace -e trace=lstat perl -E 'say $^V; <dir/b*>' 
v5.10.1
lstat("dir/baz.txt", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0
lstat("dir/bar.txt", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0
Run Code Online (Sandbox Code Playgroud)

我看到我的Linux系统上相同的行为glob(pattern)<pattern>,和更高版本的Perl.

我的期望是,globbing只是opendir/readdir,并且它不需要检查它正在搜索的实际路径名.

这是什么目的lstat?它会影响glob()的返回吗?

Fre*_*Foo 8

之前在PerlMonks上已经注意到这种奇怪的行为.事实证明,glob调用lstat支持其GLOB_MARK标志,其效果是:

作为与模式匹配的目录的每个路径名都附加了一个斜杠.

要确定目录条目是否引用了子目录,您需要stat它.即使没有给出标志,这显然已经完成.