Perl中无显式条件的-d文件测试运算符用法疑问
Perl 代码语法解释
你是对代码做了错误断句才会产生疑问,我们先把完整的print调用参数拆解开:
print $File::Find::name, -d && '/', "\n"
这里print接收3个参数,分别是$File::Find::name、-d && '/'、"\n",你提到的-d是第二个参数-d && '/'的一部分,不是独立参数,也不是隐式的if判断。
1. 关于-d文件测试运算符
Perl的文件测试运算符如果不显式指定测试目标,默认会使用$_变量作为测试对象。在File::Find的回调函数执行时:
$_对应当前遍历到的文件名(不含路径,因为回调执行时已经自动切换到了当前遍历的目录下,直接用文件名即可测试)-d就是测试$_对应的条目是否为目录,返回布尔值:是目录返回真,否则返回假
2. 关于&&短路逻辑的作用
Perl的逻辑与运算符&&有短路特性:
- 如果左边表达式为真,返回右边表达式的求值结果
- 如果左边表达式为假,直接返回左边的假值(Perl中逻辑假的字符串表现为空字符串)
所以-d && '/'的效果是: - 是目录时,返回字符串
/ - 不是目录时,返回空字符串
等价写法
这段精简的回调逻辑和下面的写法完全等价,更容易理解:
sub { my $suffix = ''; $suffix = '/' if -d $_; print $File::Find::name . $suffix . "\n"; }
最终效果就是遍历输出所有路径时,目录后面会额外加一个/标记,方便和普通文件区分。
内容的提问来源于stack exchange,提问作者giordano
相关产品推荐
相关产品推荐

