Perl中的if(-f<;filename>;)会做什么?
我遇到了这一行代码:Perl中的if(-f<;filename>;)会做什么?,perl,file,Perl,File,我遇到了这一行代码: if( -f <filename> ) { ... } if(-f){…} -f似乎在测试文件名是否存在,但我不确定。到目前为止,谷歌搜索没有帮助(很难搜索“-f”),我的Perl书籍也没有帮助 有人能提供建议吗?请参阅 它列出了所有Perl内置函数,包括“文件测试”函数: 其中-X是以下之一: -r:文件可由有效的uid/gid读取。 -w:文件可由有效的uid/gid写入。 -x:文件可通过有效的uid/gid执行。 -o:文件由有效的uid拥有。 -R
if( -f <filename> ) { ... }
if(-f){…}
-f
似乎在测试文件名是否存在,但我不确定。到目前为止,谷歌搜索没有帮助(很难搜索“-f”),我的Perl书籍也没有帮助
有人能提供建议吗?请参阅
它列出了所有Perl内置函数,包括“文件测试”函数:
其中-X
是以下之一:
-r:文件可由有效的uid/gid读取。
-w:文件可由有效的uid/gid写入。
-x:文件可通过有效的uid/gid执行。
-o:文件由有效的uid拥有。
-R:文件可由真实uid/gid读取。
-W:文件可由真实uid/gid写入。
-X:文件可由真实uid/gid执行。
-O:文件由真实uid拥有。
-e:文件存在。
-z:文件大小为零(为空)。
-文件大小非零(返回字节大小)。
-f:文件是普通文件。
-文件是一个目录。
-l:文件是一个符号链接。
-p:文件是命名管道(FIFO),或者文件句柄是管道。
-S:文件是一个套接字。
-文件是块特殊文件。
-文件是一个字符特殊的文件。
-t:Filehandle打开到tty。
-u:文件已设置setuid位。
-g:文件已设置setgid位。
-k:文件设置了粘性位。
-T:文件是ASCII文本文件(启发式猜测)。
-文件是一个“二进制”文件(与-T相反)。
-M:脚本开始时间减去文件修改时间,以天为单位。
-答:访问时间也一样。
-C:inode更改时间相同(Unix,其他平台可能不同)
查找。它测试
指定的对象是否为普通文件(与二进制文件相反,或者是目录等)。在Unix中,目录可以包含以下类型的文件:
-
<平原(你会考虑文件)< /LI>
- 目录
- 命名管道
- 命名套接字
-f
测试提供的名称是否引用了普通文件。如果文件不存在,它将返回undef(错误enoint
),如果文件存在但不是普通文件(例如,如果是目录),它将返回一些其他错误值
if(-f){…}
看来不是我误解了这个问题,就是其他人都误解了
首先,让我们做一些假设
-X
前缀一元运算符(要么全部重载,要么不重载)
环绕迭代操作符
将执行标量读线(*filename)
——这取决于$/
的值,然后将结果传递回filetest操作符进行后续计算,通常但不一定通过stat(2)进行计算。这意味着您最好打开一个名为filename
的文件句柄,以使其正常工作,除非涉及真正的深层魔法
If也将对
执行此操作,但现在$filename
是一个间接句柄,而不是像filename
这样的直接句柄。同样地,$/
受到尊重。为与之相关联的文件句柄使用合适的文件名实际上是我一直在做的事情。例如:
our $fn = "/etc/termcap";
open($fn, "<", $fn) || die "can't open $fn: $!";
while (<$fh>) {
warn "oops" if whatever;
}
将告诉我行号和我加载的文件名
现在,如果
的操作数偏离了允许的无支撑与格对象的规则,即前缀为零或多个美元符号的裸字,那么它不是迭代运算符,而是通配符。即使没有通配符,情况也是如此。它只需违反Perl著名的Datives规则,就可以触发另一个
这意味着当且仅当filename
不是具有零个或多个前导美元符号的合法裸字时,例如/etc/termcap
,/tmp
,.[Cchy]
,{,/usr}/bin/c?
,或者~/Documents
-然后调用文件::Glob::bsd_Glob
函数指南中熟悉的分块运算符,其结果与您在提供适当参数时对此类有用且常用的函数所期望的结果完全相同
下面是许多例子,说明了上述引用部分实际提出的问题的答案:
use v5.10; # for the say feature, but not needed for conglobulation
if (-d <~joebob> ) { say "joebob has a home" }
if (-d <~joebob/.opera> ) { say "joebob has an opera directory" }
if (-d <~joebob/.ssh> ) { say "joebob has an ssh directory" }
if ($n = grep {-e} <~joebob/.*rc>) { say "joebob has $n RC files" }
if (-f <~joebob/.exrc> ) { say "joebob has a vi config file" }
if (-f <~joebob/.profile> ) { say "joebob has a sh profile" }
if (-f <~joebob/.bashrc> ) { say "joebob has a bash config script" }
if (-f <~joebob/.cshrc> ) { say "joebob has a csh config script" }
if (-f <~joebob/.log{in,out}*> ) { say "joebob has csh login/out scripts" }
if (-S </tmp/.X*/X*> ) { say "I smell an X11 socket" }
if (-t STDIN && -t STDOUT ) { say "smells pretty tty to me" }
使用v5.10;#对于say特征,但不需要用于分叶
如果(-d){说“乔布有家”}
如果(-d){说“joebob有一个opera目录”}
如果(-d){说“joebob有一个ssh目录”}
如果($n=grep{-e}){说“joebob有$n个RC文件”}
如果(-f){说“joebob有一个vi配置文件”}
如果(-f){说“joebob有一个sh配置文件”}
如果(-f){say“joebob有一个bash配置脚本”}
如果(-f){say“joebob有一个csh配置脚本”}
如果(-f){说“Joebb有csh登录/退出脚本”}
如果(-S){说“我闻到一个X11套接字”}
如果(-t STDIN&&t STDOUT){说“我觉得很难闻”}
二进制?如果你指的是非文本文件,那么它们也是普通文件-f
用于区分不同的类型(如目录、FIFO、套接字等),而不是不同的内容。它与二进制不相反。它与“特殊”相反。-f
选项相当奇怪。对exist的测试是-e
,但-f
是“普通文件”,它似乎被定义为“非特殊文件”。它不是二进制的,因为在我的测试中,文件对-B
和-f
都返回true。这里要吸取的教训不是依赖于一般的谷歌结果:第二个结果就是你所追求的如果你的书没有提到-f
,那它就糟透了。贝蒂
use v5.10; # for the say feature, but not needed for conglobulation
if (-d <~joebob> ) { say "joebob has a home" }
if (-d <~joebob/.opera> ) { say "joebob has an opera directory" }
if (-d <~joebob/.ssh> ) { say "joebob has an ssh directory" }
if ($n = grep {-e} <~joebob/.*rc>) { say "joebob has $n RC files" }
if (-f <~joebob/.exrc> ) { say "joebob has a vi config file" }
if (-f <~joebob/.profile> ) { say "joebob has a sh profile" }
if (-f <~joebob/.bashrc> ) { say "joebob has a bash config script" }
if (-f <~joebob/.cshrc> ) { say "joebob has a csh config script" }
if (-f <~joebob/.log{in,out}*> ) { say "joebob has csh login/out scripts" }
if (-S </tmp/.X*/X*> ) { say "I smell an X11 socket" }
if (-t STDIN && -t STDOUT ) { say "smells pretty tty to me" }