这个Perl如何检查一个目录是否为空工作?

dsm*_*dsm 5 perl glob

我今天得到了这个奇怪的代码行,它告诉我'空'或'不空'取决于CWD是否有任何项目(除了...).

我想知道它是如何工作的,因为它对我没有意义.

perl -le 'print+(q=not =)[2==(()=<.* *>)].empty'
Run Code Online (Sandbox Code Playgroud)

我感兴趣的是<.* *>.我不明白它如何获取目录中所有文件的名称.

Mic*_*man 16

这是一个高尔夫单线.该-e标志表示执行命令行的其余部分作为程序.在-l使自动线端的处理.

<.* *>部分是一个包含两个扩展模式的glob:.**.

这一部分

(q=not =)
Run Code Online (Sandbox Code Playgroud)

是包含单个值的列表 - 字符串"not".这q=...=是一个替代的字符串分隔符,显然是使用的,因为单引号用于引用单行.

[...]部分是该列表的下标.下标的值将为0(值"not")或1(nothing,打印为空字符串),具体取决于此比较的结果:

2 == (()=<.* *>)
Run Code Online (Sandbox Code Playgroud)

这里发生了很多事情.比较测试glob是否返回了恰好两个项目的列表(假设为...),但它是如何做到这一点很棘手.内括号表示空列表.分配给此列表会将glob置于列表上下文中,以便返回目录中的所有文件.(在标量环境会表现得像一个迭代并且仅一次一个返回.)赋值本身在标量上下文进行评估(该比较的右手侧是),并因此返回分配元件的数量.

领先的+是防止Perl将列表解析为参数print.尾部.empty将字符串"empty"连接到列表中的任何内容(即"not"或空字符串).


Sin*_*nür 7

<.* *>
Run Code Online (Sandbox Code Playgroud)

是一个由两种模式组成的glob:.*所有文件名都以所有文件开头.*对应(这与通常的DOS/Windows约定不同).

(()=<.* *>)
Run Code Online (Sandbox Code Playgroud)

评估列表上下文中的glob,返回匹配的所有文件名.

然后,2将其与标量上下文进行比较,以便2与返回的文件数进行比较.如果该数字是2,那么唯一的目录条目是...,句点.;-)