zoukankan      html  css  js  c++  java
  • perl学习笔记——文件测试

    文件测试主要用于查看如文件是否存在、文件大小、文件更新时间等信息。

    文件测试操作符

    -e  测试文件是否存在;

    die "Oops!A file called '$filename' already exists. " if -e $filename;

    -M 测试文件是否保持持续的更新,比如测试某个程序的日志文件是否保持每一周或两周更新。

    此处测试的是文件句柄。

    warn "Config file is looking pretty old! " if -M CONFIG>28;

    -s 测试文件的大小,以字节计算文件大小。

     例子:下面测试的是文件大小超过100字节,且更新日期低于两天的本文件夹下的文件。

    #!/usr/bin/env perl
    #filename:test2.pl use 5.010; while(<>) { if(/A-.*/){ my @line=split /s+/,"$&"; # say "$line[8]"; say "$line[8] is bigger than 100bytes." if -s $line[8] > 100 and -M $line[8] > 2; } }
    运行命令:ls -l | ./<filename>

     如何查看文件的大小(以M为单位):my size= (-s $filename)/1024;

    注意一定要加括号。

    其他的文件测试项

    -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:索引节点修改时间(单位:天)
    复制代码

    测试同一个文件的多项属性

    if(-r $file and -w _) # 虚拟文件句柄_

    {...

    栈式文件操作符

    use 5.010;

    if( -r -w -x -o -d $file){

      print "My directory is readable,writable,and executable! ";

    }

    对于返回真假值以外的测试来说,栈式的写法并不出色。像下面的例子,我们原本是想穷人某个512字节的目录,可实际上会出问题:

    use 5.010;

    If (-s -d $file <512){

    say ‘The directory is less than 512 bytes’;

    }

    如果按照其内部的现实方式展开,我们可以看到上面的例子实际上相当于如下的写法,整个合并起来的文件测试表达成了比较运算的一个操作数:

    If ((-d $file and -s _)<512){

    Print “The directory is less than 512 bytes! ”;

    }

    -d返回为假时,Perl将假值同数字512作比较。比较的结果就变为真,因为假等效为数字0,0永远小于512。为了避免出现着这种错误,我们还是分开来写比骄傲好。

    If (-d $file and -s _ <512){

    Print “The directory is less than 512 bytes! ”;

    }

    statlstat函数

    测试文件的链接个数以及该文件的拥有者的ID

    要么返回空列表,否则就返回一个含有13个元素的数字列表。

    my($dev,$ino,$mode,$nlink,$uid,$gid,$rev,

    $size,$atime,$mtime,$ctime,$blksize,$blocks)

    =stat($filename);

    其返回的结果和stat函数返回的列表中对应的数据差不多,可以自行查看。

    对于符号连接名调用stat函数将会返回符号链接所指向的对象信息,而非符号连接本身的信息(除非连接所指的对象目前无法访问)。若你需要符号连接本身的信息(多半没用),你可以用lstat(他会返回同样的顺序 同样意义的内容)来代替stat。如果lstat的参数不是符号连接,他会和stat一样返回空列表。

    同时,statlstat的默认操作数是$_。也就是说,底层的stat系统调用会对标量变量$_里的文件名进行操作。

    Localtime函数

    通过stat获取的时间戳看起来像这个样子1180630098这种形式。但实在不容看出来表示啥意思。所以需要转换形式,转换成‘Thu May 31 09:48:18 2007’这样的字符串。Perl可以在标量上下文中使用localtime函数完成这种转换:

    my $timeswap=1180630098;

    my $date=localtime $timeswap;

    在列表下文中,localtime会返回一个数字元素组成的列表,但其中有些元素并不是你想要的:

    My ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst)

    =localtime $timestamp;

    $mon 的值0~11;

    $year 1900年开始计算,将该值加上1900就是实际的年份;

    $wday 0~6;

    $yday 则表示目前是今年的第几天,0(11)~364或者365

    gtime函数与localtime函数一样,不过返回的是世界标准时间。

    默认情况下是返回当前time返回的时间值:

    My $now=gmtime;#取得当前时间的世界标准时间的时间戳字符串

    按位运算操作符

    & | ^

    <<

    >>

    ~

  • 相关阅读:
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31
    知也atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31无涯 - I
  • 原文地址:https://www.cnblogs.com/lukexwang/p/4675466.html
Copyright © 2011-2022 走看看