Perl文件测试

常用的文件操作符:

  • -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 !