Perl语言入门笔记:第十七天
时间:2010-09-19 来源:linscora
第十二章:文件测试
早先我们已经演示如何打开文件以输出其内容。通常,打开文件的操作会直接创建一个新文件,如果存在同名文件的话,还会清空该文件的内容。有些时候,你可能需要先检查一下同名文件是否存在;有些时候,你可能需要看看给定的文件究竟存在多久了;或者有些时候,你可能需要比较一些文件的大小,看是否都在某个级别以上、并且是否已经有一段时间无人使用。对于这类信息的取得,Perl有一套完整的文件测试操作符可供你使用。 文件测试操作符:
用-e文件测试操作符测试文件存在与否:
die "Oops! Afile called '$filename' already exists.\n"
if -e $filename
$!表示系统为何拒绝请求。
测试某个文件是否能保证时常更新。我们测试的是一个已经存在的文件句柄,而非表示文件名的字符串。假设我们需要某个程序的配置文件保持每周或每两周更新一次(也许这是个病毒资料库)。如果文件在过去28天里都没变动过,显然出了问题: warn "Config file is looking pretty old!\n"
if -M CONFIG > 28;
测试某些大于100K的文件且已经超过90天没被访问,然后将它归档到磁带机上。
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;
} 文件测试操作符 意义
-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)变更后至今的天数 如果想知道以KB为单位(而不是以字节为单位)的文件大小,那么你可能会直接把-s操作的结果除以1000(或是1024),像这样:
#文件名保存在$_中
my $size_in_K = -s / 1000; #这样是错误的写法。
my $size_in_k = (-s) / 1024;#默认使用$_测试 同一文件的多项属性测试:
如果要一次测试某个文件的若干属性,可以将各个文件测试组成一个逻辑表达式。例如我们只想操作那些既可读、又可写的文件,可以依此检查两个属性并用and合并起来: if( -r $file and -w $file) {
....} #需要查寻两次文件的属性 if( -r $file and -w _ ) {
...} #只查寻一次文件的属性 也可以在两条if语句中使用:
if ( -r $file){
print "The file is readable!\n";
} if (-w _) {
print "The file is writable!\n"; 栈式文件测试:
use 5.010;
if ( -w -r $file) {
print "The file is both readable and writable!\n";
} 对于返回真假值以外的测试来说,栈式写法并不出色。像下面的例子,我们原来想要确认某个小于512字节的目录,可实际上没做到:
use 5.010;
if (-s -d $file < 512 ) { #错啦!
print "The directory is less than 512 bytes!\n";
} if ((-d $file and -s _) < 512 ) { #对啦!!
print "The directory is less than 512 bytes!\n";
}
上面这样也有问题,当-d返回假时,Perl将假值同数字512做比较。比较的结果就变为真,因为假等效为数字0,而0永远小于512。为了避免这种令人困惑的写法,还是用分开的方式写比较好,这对将来的维护程序员来说也更友善:
if ( -d $file and -s _ < 512 ) {
print "The directory is less than 512 bytes!\n";
} stat 和 lstat函数:
my($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $mtime, $ctime, $blksize, $blocks) = stat($filename); localtime函数:
my ($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst) = localtime $timestamp; gmtime函数和localtime函数一样,只不过它返回的是世界标准时间(俗称格林威治标准时间)。如果需要从系统时钟取得当前的时间戳。可以使用time函数。
my $now = gmtime; #取得当前的世界标准时间的时间戳字符串。 按位运算操作符:
如果需要逐位进行运算,比如对stat函数返回的权限位进行处理,就必须用到按位运算操作符(bitwise operator)。该操作符在二进制数据上进行数学运算。“接位与”操作符(bitwise-and,记作&)会给出两边参数对应的位置中,哪些位同时都为1.举个例子,表达式10&12得到的值是8。“按位与”操作符只有在两边相应的位均为1的状况下才会产生1.因此,10(写成二进制是1010)和12(二进制1100)的“按位与”运算结果是8(二进制是1000,也就是10和12以二进制数字表示是,同时为1的位所组成的数字)。 按位运算操作符: 表达式 意义
10 & 12 “按位与”--哪些位在两边都为真(此例得8)
10 | 12 “按位或”--哪些位在任一边为真(此例得14)
10 ^ 12 “按位异或”--哪些位在任何一边为真,但另一边为假(此例么6)
6 << 2 ”按位左移“--将左边操作数向左移动数位,移动位数由右边操作数指定,并以0来填补最低位(此例得24)
25 >> 2 ”按位右移“--将左边操作数向右移动数位,移动位数数右边操作数指定,移动位数由右边操作数指定,并丢弃移出的最低位(此例得6)
~ 10 ”按位取反“,也称为取反码--返回操作数逐位反相之后的数值(此例得0xFFFFFFF5)
早先我们已经演示如何打开文件以输出其内容。通常,打开文件的操作会直接创建一个新文件,如果存在同名文件的话,还会清空该文件的内容。有些时候,你可能需要先检查一下同名文件是否存在;有些时候,你可能需要看看给定的文件究竟存在多久了;或者有些时候,你可能需要比较一些文件的大小,看是否都在某个级别以上、并且是否已经有一段时间无人使用。对于这类信息的取得,Perl有一套完整的文件测试操作符可供你使用。 文件测试操作符:
用-e文件测试操作符测试文件存在与否:
die "Oops! Afile called '$filename' already exists.\n"
if -e $filename
$!表示系统为何拒绝请求。
测试某个文件是否能保证时常更新。我们测试的是一个已经存在的文件句柄,而非表示文件名的字符串。假设我们需要某个程序的配置文件保持每周或每两周更新一次(也许这是个病毒资料库)。如果文件在过去28天里都没变动过,显然出了问题: warn "Config file is looking pretty old!\n"
if -M CONFIG > 28;
测试某些大于100K的文件且已经超过90天没被访问,然后将它归档到磁带机上。
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;
} 文件测试操作符 意义
-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)变更后至今的天数 如果想知道以KB为单位(而不是以字节为单位)的文件大小,那么你可能会直接把-s操作的结果除以1000(或是1024),像这样:
#文件名保存在$_中
my $size_in_K = -s / 1000; #这样是错误的写法。
my $size_in_k = (-s) / 1024;#默认使用$_测试 同一文件的多项属性测试:
如果要一次测试某个文件的若干属性,可以将各个文件测试组成一个逻辑表达式。例如我们只想操作那些既可读、又可写的文件,可以依此检查两个属性并用and合并起来: if( -r $file and -w $file) {
....} #需要查寻两次文件的属性 if( -r $file and -w _ ) {
...} #只查寻一次文件的属性 也可以在两条if语句中使用:
if ( -r $file){
print "The file is readable!\n";
} if (-w _) {
print "The file is writable!\n"; 栈式文件测试:
use 5.010;
if ( -w -r $file) {
print "The file is both readable and writable!\n";
} 对于返回真假值以外的测试来说,栈式写法并不出色。像下面的例子,我们原来想要确认某个小于512字节的目录,可实际上没做到:
use 5.010;
if (-s -d $file < 512 ) { #错啦!
print "The directory is less than 512 bytes!\n";
} if ((-d $file and -s _) < 512 ) { #对啦!!
print "The directory is less than 512 bytes!\n";
}
上面这样也有问题,当-d返回假时,Perl将假值同数字512做比较。比较的结果就变为真,因为假等效为数字0,而0永远小于512。为了避免这种令人困惑的写法,还是用分开的方式写比较好,这对将来的维护程序员来说也更友善:
if ( -d $file and -s _ < 512 ) {
print "The directory is less than 512 bytes!\n";
} stat 和 lstat函数:
my($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $mtime, $ctime, $blksize, $blocks) = stat($filename); localtime函数:
my ($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst) = localtime $timestamp; gmtime函数和localtime函数一样,只不过它返回的是世界标准时间(俗称格林威治标准时间)。如果需要从系统时钟取得当前的时间戳。可以使用time函数。
my $now = gmtime; #取得当前的世界标准时间的时间戳字符串。 按位运算操作符:
如果需要逐位进行运算,比如对stat函数返回的权限位进行处理,就必须用到按位运算操作符(bitwise operator)。该操作符在二进制数据上进行数学运算。“接位与”操作符(bitwise-and,记作&)会给出两边参数对应的位置中,哪些位同时都为1.举个例子,表达式10&12得到的值是8。“按位与”操作符只有在两边相应的位均为1的状况下才会产生1.因此,10(写成二进制是1010)和12(二进制1100)的“按位与”运算结果是8(二进制是1000,也就是10和12以二进制数字表示是,同时为1的位所组成的数字)。 按位运算操作符: 表达式 意义
10 & 12 “按位与”--哪些位在两边都为真(此例得8)
10 | 12 “按位或”--哪些位在任一边为真(此例得14)
10 ^ 12 “按位异或”--哪些位在任何一边为真,但另一边为假(此例么6)
6 << 2 ”按位左移“--将左边操作数向左移动数位,移动位数由右边操作数指定,并以0来填补最低位(此例得24)
25 >> 2 ”按位右移“--将左边操作数向右移动数位,移动位数数右边操作数指定,移动位数由右边操作数指定,并丢弃移出的最低位(此例得6)
~ 10 ”按位取反“,也称为取反码--返回操作数逐位反相之后的数值(此例得0xFFFFFFF5)
习题: |
相关阅读 更多 +