分类:
2009-07-23 13:51:41
一、文件检测操作
如果程序会建立新的文件,在程序创建新文件之前,我们应先确定是否存在同名的文件,以免重要数据被覆盖掉。对于这种问题,我们可以使用–e选项,检测是否存在相同名字的文件。
例:
$filename = 'phper7.rar'; die "$filename 已经存在.\n" if -e $filename;
检测文件的选项是由连接线(-)和一个字母组成,字母指测试的类型,后接被测试的文件名或文件句柄。大多数选项返回true/false值,但有少数例外。
(1)-r, -w, -x以及-o检测相应的属性对effective user 或group ID是否为真,它是指实际负责运行此程序的用户。
(2)Unix文件系统包括几种类型,分别可有-f, -d, -l, -S, -p, -b, 以及-c检测,任何一种必属于其中之一。
(3)时间检测,-M, -A, -C(均大写),返回系统最后一次修改,访问,以及索引节点被修改到现在的天数。
(4)-T和-B分别检测一个文件是文本的还是二进制的。
(5)当给定的文件句柄是一个TTY(系统函数isatty()的返回结果,不能对文件名使用这个测试)时,-t文件检测项返回true。
二、stat和lstat函数
要得到文件的其余信息,可以使用stat函数,其返回Unix系统调用stat时相同的值。返回值或者是空列表,表明stat失败(通常是由于文件不存在),或者是13个元素的列表。
例:
my @test = ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $mtime, $ctime, $blksize, $blockes) = stat('phper7.rar'); foreach $value (@test) { print $value."\n"; }
(1)$dev和$ino
文件的设备号和索引节点号。它们组成了文件的 牌照(license plate)。即便它有多个名字,设备号和索引节点号的组合仍是唯一的。
(2)$mode
文件的权限位以及一些其它的位。
(3)$nlink
文件或目录的连接数。
(4)$uid和$gid
文件所有权的user ID及group ID。
(5)$size
返回文件大小
(6)$atime,$mtime,及$ctime
这三个时间,它们按照系统的时间格式(32位)表示从某个时刻到现在所经过的秒数,这个时刻是记录系统时间的一个任意值。
当stat的参数是符号连接时,其返回的信息是此符号连接指向的实体的信息,而非符号连接本身的信息,除非此符号连接所指向的内容不能被访问。如果需要得到符号连接本身的信息,可以使用lstat代替stat(它按照相同的顺序返回同样的值)。如果其操作数不是符号连接,则lstat和stat返回的值相同。
同文件检测(file tests)一样,stat和lstat的默认参数为$_,意指stat系统调用将针对$_所对应的文件进行操作。
三、localtime函数
转换当时间戳(timestamp)的格式。
例:
my $timestamp = 1280630098; my $date = localtime $timestamp; print $date; #输出Sun Aug 1 10:34:58 2010
例二:
my $timestamp = 1280630098; my @itime = ($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst) = localtime $timestamp; foreach $v (@itime) { print $v."\n"; }
NOTE:还有两个相关的函数也经常用到。gmtime函数同localtime一样,除了其返回的形式为是世界时间(格林威治时间)。如果想从系统中得到当前的时间,可使用time函数。localtime和gmtime,在默认的情况下都使用time的当前值(如果没有参数)。
四、位操作
如果需要对数字的位进行操作,如处理stat返回的mode位,则需要位操作符。它们对值进行二进制操作。按位与操作符(&)返回操作符左边和右边相应位操作的结果。
my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $mtime, $ctime, $blksize, $blockes) = stat('phper7.rar'); my $classcial_mode = 0777 & $mode; #将额外的高位屏蔽掉 print $classcial_mode."\n"; my $u_plus_x = $classical_mode | 0100; #将其中一位置1 print $u_plus_x."\n"; my $go_minus_r = $classical_mode & (~ 0044); #将两位置0 print $go_minus_r."\n";
所有的位操作符都可以对位串和整数进行操作。如果操作数是整数,则结果为整数。
但如果位操作符的操作数为字符串,Perl会将其作为位串进行处理。