Perl:无条件的文件测试运算符

Perl: file test operator without condition

我有这个来自 Perl Cookbook 的简单代码,它递归地打印所有目录和文件:

use File::Find;

@ARGV = qw(.) unless @ARGV;
find sub { print $File::Find::name, -d && '/', "\n" }, @ARGV;

我不明白print $File::Find::name, -d的语法。这要怎么解释?如果 -d 测试 $File::Find::name 是否是目录那么 -d 是函数 print 的参数吗?或者 Perl 是否明确地将 standalone -d 解释为 if -d?

不,-d 是一个独立的语句,它测试 $_。所以它本质上等同于

-d $_ && '/'

这表示“如果文件是一个目录,return 一个斜线字符(打印)”。 sub 代码块由 File::Find 中的 find 函数使用,其中 $_ 包含当前文件的文件名。

逗号 , 分隔 return 字符串的语句列表 print 语句:

print $File::Find::name,   # print the files name
-d && '/',                 # if it is a dir, print /
"\n"                       # print a newline

documentation for -d 中(包含在 perldoc for -X 中,其中列出了所有文件测试)指出:

If the argument is omitted, tests $_ ...

这适用于 -X 下的所有文件测试。

之所以可以这样使用&&是因为它比逗号运算符,具有更高的优先级。这记录在 perldoc perlop