我今天得到了这个奇怪的代码行,它告诉我'空'或'不空'取决于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"或空字符串).
<.* *>
Run Code Online (Sandbox Code Playgroud)
是一个由两种模式组成的glob:.*所有文件名都以所有文件开头.并*对应(这与通常的DOS/Windows约定不同).
(()=<.* *>)
Run Code Online (Sandbox Code Playgroud)
评估列表上下文中的glob,返回匹配的所有文件名.
然后,2将其与标量上下文进行比较,以便2与返回的文件数进行比较.如果该数字是2,那么唯一的目录条目是.和..,句点.;-)
| 归档时间: |
|
| 查看次数: |
2962 次 |
| 最近记录: |