1. 文件检验
1.1 文件检测操作
die “Oops! A file called‘$filename’already exists./n”
if –e $filename; 文件已存在
warn “Config file is looking pretty old!/n”
if –M CONFIG > 28; #配置文件如果在28天都没有做出修改
my@ariginal_files = qw/ fred barney betty Wilma pebbles dino bam-bamm/;
my @big_old_files; #要移到备份磁带上的文件
foreach my $filename (@original_files){
push @big_old_files, $filename
if –s $filename > 100_100 and –A $filename > 90; #大小大于100K并且超过90天没有访问过
}
表11-1 文件检测选项及其含义
检测选项含义
-r 文件或目录对此(有效的)用户(effective user)或组是可读的
-w 文件或目录对此(有效的)用户或组是可写的
-x 文件或目录对此(有效的)用户或组是可执行的
-o 文件或目录由本(有效的)用户所有
-R 文件或目录对此用户(real user)或组是可读的
-W 文件或目录对此用户或组是可写的
-X 文件或目录对此用户或组是可执行的
-O 文件或目录由本用户所有
-e 文件或目录名存在
-z 文件存在,大小为0(目录恒为false)
-s 文件或目录存在,大小大于0(值为文件的大小,单位:字节)
-f 为普通文本
-d 为目录
-l 为符号链接
-S 为socket
-p 为管道(Entry is a named pipe(a“fifo”))
-b 为block-special 文件(如挂载磁盘)
-c 为character-special 文件(如I/O 设备)
-u setuid 的文件或目录
-g setgid 的文件或目录
-k File or directory has the sticky bit set
-t 文件句柄为TTY(系统函数isatty()的返回结果;不能对文件名使用这个测试)
-T 文件有些像“文本”文件
-B 文件有些像“二进制”文件
-M 修改的时间(单位:天)
-A 访问的时间(单位:天)
-C 索引节点修改时间(单位:天)
具体的东西可以用的比较少,真正要用的时候回来查就行了
1.2 stat 和lstat 函数
my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $mtime, $ctime, $blksize, $blockes)
= stat($filename);
就是返回文件更多的状态,具体状态也自己看吧,应该看得懂
Lstat当然就是当filename是link的时候,返回它作为link的信息,因为如果用stat,返回的是它链接的文件的信息
1.3 localtime 函数
标量上下文中:返回:如“The May 31 09:48:18 2007”
my $timestamp = 1180630098;
my $date = localtime $timestamp;
列表上下文返回:
my($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst)
= localtime $timestamp;
1.4 位操作
和c差不多
10 & 12 按位与;当操作数相应位均为1 时结果为1 (本例结果为8)
10 | 12 按位或;当操作数中相应位有一个为1 则结果为1(本例结果为14)
10 ^ 12 按位异或;当操作数中相应位有且仅有一个为1,结果才为1(本例结果6)
6 << 2 位左移,将左边操作数左移右边操作数所指定的位数,被移出的位置(右边)补0(结果为24)
25 >> 2 位右移,将左边操作数右移动右边操作数所指定的位数,丢弃多余的位数(左边)(本例结果位6)
~10 位取反,也叫做一元位补运算;其返回值为操作数中相应位取反的值(本例为0Xfffffff5,这和具体情况
有关)
1.4.1.使用位串
所有的位操作符都可以对位串和整数进行操作。如果操作数是整数,则结果为整数
~10 得到的是64 位的结果:0Xfffffffffffffffffff5,而非32 位的结果:0Xfffffff5。)
但如果位操作符的操作数为字符串,Perl 会将其作为位串进行处理。
“/xAA”| “/x55”得到的结果是“/xFF”。
1.5 使用特殊的下划线文件句柄
my @original_files = qw/ fred barney bettyWilma pebbles dino bam-bamm/;
my @big_old_files; #需要移到备份磁带上去的文件
foreach(@orginal_files){
push @big_old_files, $_
if (-s) > 100_100 and –A _ > 90; #比以前的方法效率高
当对_ 这个文件句柄(此操作数为单个下划线)进行文件检测(file test),stat,或lstat 操作时,将要求Perl 对前一个文件检测(file test), stat,或lstat 函数的操作数进行操作,而非再一次的进行系统调用。
第一次检测时使用了默认的变量$_。这也更加有效率(可能除了对程序员之外),他从操作系统中得到数据。第二次检测使用了_ 这个文件句柄。这次检测中,使用第一次检测的文件的大小信息,这是我们所需要的。