Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1476457
  • 博文数量: 139
  • 博客积分: 10005
  • 博客等级: 中将
  • 技术积分: 4740
  • 用 户 组: 普通用户
  • 注册时间: 2005-03-01 14:39
文章分类

全部博文(139)

文章存档

2010年(63)

2009年(27)

2008年(49)

我的朋友

分类:

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会将其作为位串进行处理。

阅读(719) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~