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

gio*_*ano 3 testing perl operators

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

use File::Find;

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

我不明白print $File::Find::name, -d. 这要怎么解释?如果-d测试 if$File::Find::name是一个目录,那么-d函数的参数也是print?或者 Perl 是否明确地将独立 解释-dif -d

TLP*_*TLP 8

不,这-d是一个独立的声明,它测试$_. 所以本质上等同于

-d $_ && '/'
Run Code Online (Sandbox Code Playgroud)

上面写着“如果文件是一个目录,则返回一个斜杠字符(打印)”。所述sub码块由所使用的find从功能File::Find,其中$_包含了当前文件的文件名称。

逗号,分隔为语句返回字符串的print语句列表:

print $File::Find::name,   # print the files name
-d && '/',                 # if it is a dir, print /
"\n"                       # print a newline
Run Code Online (Sandbox Code Playgroud)

文档-d(包含在用于perldoc代码-X,所有的文件测试中列出)状态:

If the argument is omitted, tests $_ ...
Run Code Online (Sandbox Code Playgroud)

这适用于-X.

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