【问题标题】:Test if file is NOT a directory in Perl测试文件是否不是 Perl 中的目录
【发布时间】:2011-12-04 23:18:32
【问题描述】:

我知道您可以使用以下方法测试文件是否为目录:

if(-d $filename)

但是如果不是目录,如何测试呢?

【问题讨论】:

标签: perl file operators conditional-statements


【解决方案1】:

您有没有想过尝试以下方法?

if (! -d $filename) ...

-d 的结果毕竟是可以被视为布尔值的东西,因此逻辑非运算符! 可以正常工作。

而且,如果您的目标比“不是目录”更具体,请参阅here。有相当多的东西不是目录,有时将其视为常规文件是没有意义的。

请记住,这是假设您已经验证了文件名存在。如果您对不存在的文件名执行 ! -d,它将返回 true。

你是否认为一个不存在的东西是“不是一个目录”是一个哲学问题,但是,如果你想确保它也存在,你可以将! -d-e结合使用,喜欢:

if ((-e $filename) && (! -d $filename)) ...

【讨论】:

  • 我只是无法以足够快的速度达到 30 个字符......我认为这个问题真的让我感到震惊。
  • 请注意:根据您如何解析 OP 的需求,这个答案可能是错误的。我解析它的方式是,他想知道某个东西是否是文件而不是目录 - 即使对于首先不是文件的东西,这个答案也会返回 true(例如 !-d NO_SUCH_FILE 返回 true)。
【解决方案2】:

要测试某个东西是否是一个文件,而不是一个目录,你需要简单地结合两个测试(没有单一的测试):

if (-e $file && !-d $file) { # a file but not a directory }

请注意:

  • 恕我直言,paxdiablo 的回答对于问题的措辞是错误的(纯!-d 不适用于用户询问的内容,因为它检查随机事物/字符串是否不是目录,不是某物是否是不是目录的文件)。例如。 !-d NO_SUCH_FILE 返回真。

  • Greg 的回答可能完全正确,具体取决于原始用户是否打算在其“不是目录的文件”的定义中包含非普通文件(例如符号链接、命名管道等)。如果他们打算包含所有这些特殊的“文件”,那么 Greg 的回答也是错误的,因为“-f”将它们排除在外(正如 Greg 首先在他的回答中明智地指出的那样)。

【讨论】:

    【解决方案3】:

    本着TIMTOWTDI的精神:

    unless (-d $filename)
    

    【讨论】:

    • 非常优雅
    【解决方案4】:

    -f 操作符会测试某个东西是否是“常规文件”。这不包括目录,但也不包括管道和设备节点等内容。

    if (-f $filename) { ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-19
      • 2011-04-17
      • 2014-04-01
      • 1970-01-01
      • 2018-07-23
      • 1970-01-01
      • 2011-01-12
      • 2014-01-12
      相关资源
      最近更新 更多