我有一些像这样的代码:
if (!-d _ || !-o _ || ($vncUserDirUnderTmp && ($mode & 0777) != 0700)) {
raise Exception("$prog: Wrong type or access mode of $vncUserDir.\n")
}
我能找到的关于在Perl @_
和$_
,但不能单独约_
信息。 这里的-d _
和-o _
是什么意思?
我有一些像这样的代码:
if (!-d _ || !-o _ || ($vncUserDirUnderTmp && ($mode & 0777) != 0700)) {
raise Exception("$prog: Wrong type or access mode of $vncUserDir.\n")
}
我能找到的关于在Perl @_
和$_
,但不能单独约_
信息。 这里的-d _
和-o _
是什么意思?
当如果任何文件测试的(或任一stat
或lstat
操作者)被给予由孤的特殊文件句柄与前一文件试验的filetest (-X)操作者stat
结构用于
使用下划线,则使用先前文件测试的
stat
结构(或stat
运算符),以保存系统调用。
...
例子:stat($filename); print "Readable\n" if -r _; print "Writable\n" if -w _; ...
所以,在你的榜样-ed !-d _
测试最后stat
文件是否不是目录。
更新
不寻常_
确实是一个类型团*_
但与运营商期望一个文件句柄的*
可以省略,如<*STDIN>
可以写成<STDIN>
。它是在符号表
print *{$main::{_}}{IO}, "\n"; # --> IO::Handle=IO(0x2311970)
在一个班轮的*_
仅获得呼叫stat
和_
由后成立的发现。
当你调用文件测试操作符(-f
,-d
,-s
等)的Perl实际上使操作系统的stat
函数调用的一个。 stat
函数返回一个结构,其中包含有关该文件的各种有趣信息,但每个文件测试运算符只查看该结构中的某个字段(它是一个文件吗?它是一个目录吗?有多大它是?)
这很常见,你可能想知道更多关于一个文件的信息(它是一个文件吗?我可以读它吗?我可以执行它吗?)这种天真的写法是:
if (-f $file and -r $file and -x $file)
但是,三次调用stat
- 他们每个人只看结构中的一个字段。为了缓解这种情况,Perl很聪明并缓存了最近拨打stat
的结果。它被缓存在特殊的文件句柄_
中。所以写相同的代码更有效的方式是:
if (-f $file and -r _ and -x _)
这只会让一个人呼叫stat
。
由于Perl 5。10,你还可以使用“叠文件测试”,并写代码:
if (-x -r -f $file) # Note reversed order of operators
更新:perldoc说,这大约堆叠文件操作符。
和Perl 5.10.0,因为纯粹的语法糖的形式,你可以 堆栈文件测试的运营商,在某种程度上是
-f -w -x $file
相当于 对"-x $file && -w _ && -f _
。 (这只是看中 语法:如果您使用的-f $file
的返回值作为参数 到另一个filetest操作,没有特殊的魔力会发生。)
他们实际上排队(从左到右),对吧? – ikegami
今天我学到了一些新东西! (不知道可堆叠文件测试。) –
'-d'测试该文件是不是一个目录! 。 '-o'检查文件所有权 –
对于采用文件句柄的操作符,可以传递glob的名称。 '-d _'是'-d * _'的简写,就像'print STDOUT ...'是'print * STDOUT ...'的简写...' – ikegami
您的代码实际上是否读取了“if(...):raise Exception (......)“?这个语法是否来自某个模块? – Matthias