在没有$或@的Perl中,_(单下划线)是什么?

我有这样的代码:

if (!-d _ || !-o _ || ($vncUserDirUnderTmp && ($mode & 0777) != 0700)) { raise Exception("$prog: Wrong type or access mode of $vncUserDir.\n") } 

我可以在Perl中find关于@_$_ ,而不是单独关于_ 。 这在-d _-o _这里是什么意思?

与filetest(-X)运算符一起使用时,将使用以前的文件testing的stat结构

如果任何文件testing(或statlstat运算符)被赋予由单独下划线组成的特殊文件句柄,则使用前一个文件testing(或stat运算符)的stat结构,从而保存系统调用。

例:

 stat($filename); print "Readable\n" if -r _; print "Writable\n" if -w _; ... 

所以在你的例子中!-d _testing最后一个stat -ed文件是不是一个目录。

更新

不寻常的_实际上是一个typeglob *_但是如果操作符期望一个文件句柄,则可以省略<*STDIN> ,例如<*STDIN>可以写成<STDIN> 。 它在符号表中find

 print *{$main::{_}}{IO}, "\n"; # --> IO::Handle=IO(0x2311970) 

在一行中,只有在调用stat_之后才能设置*_

当你调用一个文件testing运算符( -f-d-s等)时,Perl实际上会调用操作系统的stat函数。 stat函数返回一个结构,其中包含有关所涉及文件的各种有趣的信息,但是每个文件testing运算符只会查看该结构中的某个字段(它是一个文件吗?它是一个目录吗?它?)

通常你可能想知道更多有关文件的信息(这是一个文件吗?我可以读它吗?我可以执行它吗?)这种天真的写法是:

 if (-f $file and -r $file and -x $file) 

但是,这三个要求stat – 每个人只看结构的领域之一。 为了缓解这个问题,Perl很聪明并caching了最近一次调用stat 。 它被caching在特殊的文件句柄_ 。 所以编写相同代码的更有效的方法是:

 if (-f $file and -r _ and -x _) 

这只会打一个stat

由于Perl 5.10,你也可以使用“堆叠文件testing”,并写下如下代码:

 if (-x -r -f $file) # Note reversed order of operators 

更新: perldoc说这关于堆叠的文件操作。

从Perl 5.10.0开始,作为一种纯粹的语法糖的forms,可以使用-f -w -x $file等价于"-x $file && -w _ && -f _ (这只是一个奇特的语法:如果你使用-f $file的返回值作为另一个-f $filetesting运算符的参数,那么不会发生特殊的魔法。)