常用的文件操作符:
- -x 对当前用户来说是可执行的
- -e 文件或目录是存在的
- -s 返回以字节为单位的文件大小
- -M 最后一次被修改后至今的天数
- -A 最后一次被访问后至今的天数
- -d 是目录
- -f 是普通文件
- -o 文件或目录,由当前用户拥有
文件测试符后面接上要测试的文件名或者文件句柄。 我们来看一个例子,假设我们硬盘已满, 想找到那种很大同时又很久没用过的文件。
my @original_files = qw{ fred barney betty wilma pebbles };
my @big_old_files;
foreach my $file (@original_files){
push @big_old_files ,$file
if -s $file > 100_000 and -A $file >90;
}
测试同一文件的多项属性
if(-r $file and -w $file){
do somthing;
}
if(-r $file and -w _){
do somthing;
}
第一种方式效率低下,因为-r测试的时候就会拿一遍所有的相关信息,-w测试再拿一遍造成了浪费,当对海量文件做各种属性测试时,就会造成严重的性能问题,解决办法是使用虚拟文件句柄_,它会保存上一次查询过的文件信息来做当前测试。但,要注意,如果两个文件测试之间对别的文件句柄进行了查询,那么虚拟文件句柄保存的信息就发生了变化。
栈式文件测试操作符
将文件测试操作符排成一行,放在测试的文件名前,一次完成所有的测试工作。
if(-r -w -x -o -d $file){
do something;
}
stat和lstat函数
如果想知道除了文件操作符可以查到的属性以外的其他文件信息,可以使用stat函数,如果文件存在,它会返回一个列表,否则返回空列表。stat的参数可以是文件句柄,虚拟文件句柄,文件名。如果想查询符号链接的信息,则应该使用lstat。
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);
$dev,$ino
文件所在设备编号和文件inode编号,这两个编号决定了文件的唯一性,就像发给文件的拍照,即使它具有多个不同的文件名(使用硬链接创建),设备编号与inode编号的组合依然是独一无二的。
$mode
文件的权限位集合,类似于-rwxr-xr-x这样的字符串开始。八进制数值0755这样的数。
$nlink
文件或目录的硬链接数,也就是这个条目有多少个真实名称,对于目录来说总会是2或者更大的数字,对文件来说通常是1。
$uid,$gid
以数值形式表示文件拥有者的用户ID及组ID。
$size
与-s相同。
$atime,$mtime,$ctime
三种时间戳,一个32位的整数,从unix元年开始计算,即1970年午夜开始过去的秒数。
localtime函数
你能获得的时间通常会像1190630098这样的形式,表示unix时间到现在流逝的秒数,这样的时间不方便阅读,应该使用localtime函数来解读。
my ($sec,$min,$hour,$day,$month,$year,$wday,$yday,$isdst) = localtime $timestamp;
my $timestamp = 1180630098;
my $date = localtime $timestamp;
$wday表示星期几.
$yday表示目前是当年的第几天,范围是0-364或者0-365.
$year是从1900年开始算的
若干需要取得系统时钟当前的时间戳,可以使用time函数,在不提供参数的情况下,localtime默认使用time返回的时间值:
my @now = localtime;
Comments !