文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Perl语言入门笔记:第十七天

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)

习题:
foreach my $file (@ARGV) {
  my $attribs = &attributes($file);
  print "'$file' $attribs.\n";
  }
  
  my $file = shift @_;
  return "does not exist" unless -e $file;
  
  my @attrib;
  push @attrib, "readable" if -r $file;
  push @attrib, "writable" if -w $file;
  push @attrib, "executable" if -x $file;
  return "exists" unless @attrib;
  'is' . join " and ", @attrib;    


相关阅读 更多 +
排行榜 更多 +
战术任务

战术任务

飞行射击 下载
愤怒的兽人战争安卓版

愤怒的兽人战争安卓版

冒险解谜 下载
粉碎射手跑安卓版

粉碎射手跑安卓版

冒险解谜 下载