测试文件是否不是Perl中的目录

时间:2011-10-11 02:39:20

标签: perl file operators conditional-statements

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

if(-d $filename)

但是如何测试它是否不是目录?

4 个答案:

答案 0 :(得分:15)

您是否考虑过尝试以下操作?

if (! -d $filename) ...

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

而且,如果您正在使用更具体的而不是“非目录”,请参阅here。有很多东西不是目录,有时候它们作为常规文件处理是没有意义的。

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

关于你是否认为一个不存在的东西是“不是一个目录”是一个哲学问题,但是,如果你想确保它也存在,你可以将! -d与{{1}结合使用类似于:

-e

答案 1 :(得分:5)

要测试某件事是否是文件,但不是目录,您需要简单地组合2个测试(没有单个测试):

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

请注意:

  • 得到应有的尊重,paxdiablo对问题措辞方式的回答是错误的(纯!-d不适用于用户询问的内容,因为它检查随机的东西/字符串是不是目录,不是某个东西是不是目录的文件)。例如。 !-d NO_SUCH_FILE返回true。

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

答案 2 :(得分:3)

本着TIMTOWTDI的精神:

unless (-d $filename)

答案 3 :(得分:2)

-f运算符测试是否某些内容是“常规文件”。这会排除目录,但也会排除管道和设备节点之类的内容。

if (-f $filename) { ...