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;#取得当前时间的世界标准时间的时间戳字符串

    按位运算操作符

    & | ^

    <<

    >>

    ~

  • 相关阅读:
    BIEE建模参考规范
    informatica 学习日记整理
    Web Service 的工作原理
    Oracle 时间差计算
    oracle基础知识
    Oracle 外连接和 (+)号的用法
    根据appId匹配项目名称
    vue技术分享-你可能不知道的7个秘密
    echarts3 迁徙图 迁入迁出
    ES6学习笔记
  • 原文地址:https://www.cnblogs.com/lukexwang/p/4675466.html
Copyright © 2011-2022 走看看