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

时间:2017-09-14 09:14:29

标签: perl

我有一些像这样的代码:

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

我可以在Perl中找到有关@_$_的信息,但不能单独找到有关_的信息。 这里的-d _-o _是什么意思?

2 个答案:

答案 0 :(得分:55)

filetest (-X)运算符一起使用时,使用前一个文件测试的function copy(text) { var input = document.createElement('input'); input.setAttribute('value', text); document.body.appendChild(input); input.select(); var result = document.execCommand('copy'); document.body.removeChild(input) return result; } 结构

  

如果任何文件测试(或statstat运算符)被赋予由单独下划线组成的特殊文件句柄,则前一个文件测试的lstat结构(或stat运算符)用于保存系统调用   ...
  示例:

stat

因此,在您的示例stat($filename); print "Readable\n" if -r _; print "Writable\n" if -w _; ... 中,测试文件最后!-d _ - ed是否不是目录。

更新

异常stat实际上是一个typeglob _但是如果操作员期望文件句柄,*_可能会被省略,例如*可能会被写为<*STDIN> 。它可以在符号表中找到

<STDIN>

只有在调用print *{$main::{_}}{IO}, "\n"; # --> IO::Handle=IO(0x2311970) *_后,才会设置stat

答案 1 :(得分:38)

当您调用其中一个文件测试运算符(-f-d-s等)时,Perl实际上会调用操作系统{{1}功能。 stat函数返回一个结构,其中包含有关该文件的各种有趣信息,但每个文件测试操作符只查看该结构中的一个字段(它是一个文件吗?它是一个目录吗? ?它有多大?)

您可能想要了解更多关于文件的一条信息(它是一个文件吗?我可以读取它吗?我可以执行吗?)这是很常见的。编写的简单方法是:< / p>

stat

但这会对if (-f $file and -r $file and -x $file) 进行三次调用 - 每次调用只会查看结构中的一个字段。为了缓解这种情况,Perl很聪明,并将最近一次调用的结果缓存到stat。它是针对特殊文件句柄stat缓存的。因此,编写相同代码的更有效方法是:

_

只拨打if (-f $file and -r _ and -x _) 一次。

从Perl 5.10开始,您还可以使用&#34;堆叠文件测试&#34;并将此代码编写为:

stat

更新: perldoc说明堆叠文件操作符。

  

从Perl 5.10.0开始,作为一种纯粹的语法糖,你可以   以if (-x -r -f $file) # Note reversed order of operators 的方式堆栈文件测试运算符   相当于-f -w -x $file。 (这只是幻想   语法:如果使用"-x $file && -w _ && -f _的返回值作为参数   到另一个filetest操作符,不会发生特殊的魔法。)