我有一些像这样的代码:
if (!-d _ || !-o _ || ($vncUserDirUnderTmp && ($mode & 0777) != 0700)) {
raise Exception("$prog: Wrong type or access mode of $vncUserDir.\n")
}
我可以在Perl中找到有关@_
和$_
的信息,但不能单独找到有关_
的信息。
这里的-d _
和-o _
是什么意思?
答案 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;
}
结构
如果任何文件测试(或
stat
或stat
运算符)被赋予由单独下划线组成的特殊文件句柄,则前一个文件测试的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操作符,不会发生特殊的魔法。)