一般打开文件的操作会直接创建一个新文件,如果存在同名文件的话,还会清空该文件的内容。
1. 文件测试操作符
perl提供了以组用于测试文件的操作符,借此返回特定的文件信息。
绝大多数测试操作符返回布尔值真/假值,虽然它们叫做操作符,不过它们的帮助文档是写在perlfunc
里的
要查看完整清单,可以perldoc -f -X
,perldoc不能单独列出其中某个测试操作符
die "Ooops! A file called '$filename' already exists.\n"
if -e $filename;
warn "Config file is looking pretty old!\n"
if -M CONFIG > 28;
my @original_files = qw/ fred barney betty wilma pebbles dino bamm-bamm /;
my @big_old_files;
foreach my $filename(@original_files){
push @big_old_files, $filename
if -s $filename > 100_000 and -A $filename > 90;
}
所有这些文件操作测试符看起来都是同一种形式:连字符加上1个字母
大多数文件测试符返回的都是布尔真/假值,少数返回的是表示特别意义的数据
文件测试操作符 | 意义 |
---|---|
-r | 文件或目录,对目前(有效的)用户或组来说是可读的 |
-w | 文件或目录,对目前(有效的)用户或组来说是可写的 |
-x | 文件或目录,对目前(有效的)用户或组来说是可执行的 |
-o | 文件或目录,由目前(有效的)用户拥有 |
-R | 文件或目录,对实际的用户或组来说是可读的 |
-W | 文件或目录,对实际的用户或组来说是可写的 |
-X | 文件或目录,对实际的用户或组来说是可执行的 |
-O | 文件或目录,由实际的用户拥有 |
-e | 文件或目录,是存在的 |
-z | 文件存在而且没有内容(对目录来说永远为假) |
-s | 文件或目录存在而且有内容(返回值是以字节为单位的文件大小) |
-f | 是普通文件 |
-d | 是目录 |
-l | 是符号链接 |
-S | 是socket类型的文件 |
-p | 是命名管道,也就是先入先出(fifo)队列 |
-b | 是块设备文件(比如某个可挂载的磁盘) |
-c | 是字符设备文件(比如某个I/O设备) |
-u | 文件或目录设置了setuid位 |
-g | 文件或目录设置了setgid位 |
-k | 文件或目录设置了sticky位 |
-t | 文件句柄是TTY设备(类似系统函数isatty()的测试,不能对文件名进行此测试) |
-T | 看起来像是文本文件 |
-B | 看起来像是二进制文件 |
-M | 最后一次被修改至今的天数 |
-A | 最后一次被访问后至今的天数 |
-C | 最后一次文件节点编号(inode)变更后至今的天数 |
所谓的有效用户,指的是“负责”运行这个程序的人
相应的-R、-W 、-X 和 -O
测试使用的是实际用户或组的ID,这在程序以set-ID
方式运行时很重要。在这种情况下,它是调用程序的用户ID
这些测试会查看文件的“权限位(permission bit)”,以此判断哪些操作时允许的,如果系统使用访问控制列表(Access Control List, ACL),那么测试将根据该列表进行判断
Unix文件系统上有且仅有7种文件类型,分别可由以下7种文件测试操作符代表:-f -d -l -S -p -b -c
,任何1个文件的类型都应该符合其中一种。不过指向某个文件的符号链接,-f和-l都会为真。
文件时间测试符,-M -A -C
分别会返回从该文件最后一次被修改、被访问或者他的inode被更改后到现在的天数(inode是文件系统的索引条目,其中记录了某个文件的所有属性信息,但文件内容除外,具体细节可以看看系统函数stat的文档)。
天数用浮点数表示
在检查文件的时间记录时,可能会得到-1.2这样的负数,这表示文件最后一次被访问的时间戳是在未来的30小时后!
实际上,程序开始运行的那一刻会被记录下来作为当前时间,而在做关于时间的文件测试时计算两者之间的时间间隔,所以负值可能表示已经运行很久的程序找到某个刚刚才被访问的文件。或者是谁不小心将文件属性设为未来时间。
perl怎么判断某个文件时文本文件,还是二进制文件呢???
perl会打开文件,检查开头的几千字节,对文件类型做出一个合理的推测。如果它看到很多空字节、不寻常的控制字符而且还设定了高位(即第8位时1)的字节,那么它看起来就是二进制文件。
如果文件不存在,-T和-B都会返回假,这个文件既不是文本文件也不是二进制文件
如果这是一个空文件,-T和-B都会返回真,因为它既是一个空的文本文件也是一个空的二进制文件
关于-t的测试,如果被测试的文件句柄是一个TTY设备,测试的返回值就为真。简单来说,如果该文件可以交互,就判断为TTY设备。所以普通文件或管道都可以排除在外。
当-t STDIN
返回值为真的时候,通常意味着可以用交互的方式向用户题出一些问题,如果返回值为假,那就表示输入来源是个普通文件或管道,而不是键盘
可能用IO::Interactibve模块来判断会更好!!!
如果文件测试操作符后面没写文件名或文件句柄,那么默认的操作数就是$_
里的文件名,不过-t的默认操作数是STDIN
foreach(@lots_of_filenames){
print "$_ is readable.\n" if -r;
}
my $size_in_K = -s / 1000; # 当perl看见斜线时,会以为这是一个正则表达式,但是却没有找到这个正则表达式的末尾,所以报错
my $size_in_K = (-s)/ 1000; # 这样就对啦!使用$_进行测试
my $size_in_K = (-s $filename)/ 1024; # 这样写更安全!!!