在没有$或@的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(或
stat
或lstat
运算符)被赋予由单独下划线组成的特殊文件句柄,则使用前一个文件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 $file
testing运算符的参数,那么不会发生特殊的魔法。)