2017-09-14 77 views
38

我有一些像这样的代码:

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

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

+0

'-d'测试该文件是不是一个目录! 。 '-o'检查文件所有权 –

+2

对于采用文件句柄的操作符,可以传递glob的名称。 '-d _'是'-d * _'的简写,就像'print STDOUT ...'是'print * STDOUT ...'的简写...' – ikegami

+1

您的代码实际上是否读取了“if(...):raise Exception (......)“?这个语法是否来自某个模块? – Matthias

回答

50

当如果任何文件测试的(或任一statlstat操作者)被给予由孤的特殊文件句柄与前一文件试验的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_由后成立的发现。

35

当你调用文件测试操作符(-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操作,没有特殊的魔力会发生。)

+1

他们实际上排队(从左到右),对吧? – ikegami

+5

今天我学到了一些新东西! (不知道可堆叠文件测试。) –

相关问题