【问题标题】:How does this Perl one liner to check if a directory is empty work?这个 Perl 单线如何检查目录是否为空?
【发布时间】:2009-07-14 15:38:50
【问题描述】:

我今天得到了这行奇怪的代码,它告诉我“空”或“非空”取决于 CWD 中是否有任何项目(... 除外)。

我想知道它是如何工作的,因为它对我来说毫无意义。

perl -le 'print+(q=not =)[2==(()=<.* *>)].empty'

我感兴趣的是&lt;.* *&gt;。我不明白它是如何获取目录中所有文件的名称的。

【问题讨论】:

  • 随意编辑标签以获得更合适的内容
  • 哈哈,你太搞笑了!我笑着在地板上打滚。你叫 Perl 线路噪音!!!!哈哈哈哈哈哈哈哈哈哈哈哈!
  • 很好地提交了“年度混淆”。我喜欢 Perl,但我更喜欢 Perl 代码中的 cmets。
  • @jockway 不,我叫 this perl line-noise
  • @dsm 其他人发表了一条评论(已删除),说所有 Perl 都是行噪音。我认为 jrockway 对此做出了回应。

标签: perl glob


【解决方案1】:

这是一个打高尔夫球的单线。 -e 标志表示将命令行的其余部分作为程序执行。 -l 启用自动行结束处理。

&lt;.* *&gt; 部分是一个包含两个要扩展的模式的 glob:.**

这部分

(q=not =)

是一个包含单个值的列表——字符串“not”。 q=...= 是另一种字符串分隔符,显然是因为单引号用于引用单行。

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

2 == (()=<.* *>)

这里发生了很多事情。比较测试 glob 是否返回正好包含两个项目的列表(假设为 ...),但它是如何做到的却很棘手。内括号表示一个空列表。分配给此列表会将 glob 置于列表上下文中,以便它返回目录中的所有文件。 (在标量上下文中,它的行为类似于迭代器,一次只返回一个。)赋值本身在标量上下文中进行评估(位于比较的右侧),因此返回分配的元素数。

前导+ 是为了防止Perl 将列表解析为print 的参数。结尾的 .empty 将字符串“empty”连接到列表中的任何内容(即“not”或空字符串)。

【讨论】:

  • 这有点误导。内部 () 使它成为一个列表赋值,它给出了它的右操作数列表上下文,但它也可以是 (2==(@a=<.>))。
  • @ysth:我不知道你为什么认为这是误导。由于内部() 中没有任何内容,因此该列表被丢弃。括号的目的(从程序员的角度来看)是将列表上下文强加给 glob。他本可以分配给一个数组(恕我直言,这会更清楚),但他没有。还是您指的是空赋值将语义从“标量上下文中的列表返回最后一个元素”更改为“列表赋值返回元素的数量”?我可能应该编辑答案以澄清这一点......
【解决方案2】:
<.* *>

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

(()=<.* *>)

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

然后,与2 的比较将其置于标量上下文中,因此2 与返回的文件数进行比较。如果该号码是2,那么唯一的目录条目是...,句号。 ;-)

【讨论】:

    【解决方案3】:

    &lt;.* *&gt; 表示(glob(".*"), glob("*"))glob 以与 shell 相同的方式扩展文件模式。

    【讨论】:

      【解决方案4】:

      我发现B::Deparse 模块在破译一些让大多数程序员眼花缭乱的东西方面很有帮助,例如q=...= 构造:

      $ perl -MO=Deparse,-p,-q,-sC 2>/dev/null << EOF
      > print+(q=not =)[2==(()=<.* *>)].empty
      > EOF
      use File::Glob ();
      print((('not ')[(2 == (() = glob('.* *')))] . 'empty'));
      

      当然,这不会立即产生“可读”的代码,但它肯定会转换一些绊脚石。

      【讨论】:

      • 嘿。再多的解析也不会去混淆使用布尔值来索引匿名列表。 [反迂腐:是的,我知道“匿名名单”是多余的。]
      【解决方案5】:

      该功能的文档是here。 (滚动到该部分的末尾附近)

      【讨论】:

      • 什么功能?这应该是对某人回答的评论吗?
      • @Telemachus: 大概意思是 glob。
      • @Telemachus:glob/ 的文档,正如@ysth 提到的那样
      猜你喜欢
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 2011-11-21
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多