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
我有这个来自 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