• Perl 学习笔记-文件测试


    1.文件测试操作符

       针对文件和目录的测试操作符:

        -r/-w/-x/-o: 文件或目录, 对有效的(负责运行这个程序的)用户或组来说是可读/写/执行/拥有 的; 这些测试位会查看文件的权限位, 以此判断哪些操作是允许的, 如果系统使用访问控制列表(ACL), 那么测试就按列表进行判断, 但是只是测试结果只是操作系统的看法, 但是受实际情况限制, 运行的事未必可行, 如空文件运行运行, 但是并没有什么意义.

        -R/-W/-X/-O: 文件或目录, 对实际的用户或组来说是可读/写/执行/拥有 的; 使用的是实际用户或组的ID, 这在程序以set-ID方式运行时相当重要.

        -e: 文件或目录, 是存在的

        -z: 文件存在但无内容(对目录来说永远为假)

        -s: 文件或目录存在且有内容, 返回以字节为单位的文件大小

        -f: 是普通文件

        -d: 是目录

        -l: 是符号链接

        -S: 是socket类型的文件

        -p: 是命名管道, 也就是FIFO队列

        -b: 是块设备文件 (如某个可挂载的磁盘)

        -c: 是字符设备文件 (如某个I/O设备)

        -u/-g/-k: 文件或目录设置了setuid/setgit/sticky位

        -t: 文件句柄是TTY设备(类似系统函数isatty()的测试, 不能对文件名进行此测试);  如果文件可以交互就会判断为TTY设备,  所以普通文件或管道都可以排除在外, 当  -t STDIN 返回真的时候, 通常意味着可以用交互的方式向用户提出一些问题, 若为假, 则表示输入来源是个普通文件或管道, 而不是键盘.

        -T/-B: 看起来像是文本文件/二进制文件(因为判断并不是很准确)

        -M/-A/-C: 最后一次  修改后/访问后/文件节点编号变更后  至今的天数

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

       if(-r $filename and -w $filename){} 操作会2次获取同一个文件的属性, 比较浪费.  可以使用虚拟文件句柄  _ 来告诉Perl用上次查询过的文件信息来做当前的测试.  if(-r $filename and -w _){} , 只要是查询上一次获取到的同一个文件的属性信息, 那么在其他地方也可以使用这个虚拟文件句柄. 

    3.栈式文件测试操作.

       可以一次测试多个文件的属性,靠近文件名的测试会先执行,次序为从右往左,不过通常来说测试次序不是很重要。 if(-r -w -x -o -d $filename){} 

      对于返回真假值以外的测试来说,栈式写法并不出色。例如,想要确认某个小于512字节的目录:  if(-s -d $filename < 512){} 这样写就不对, 等同于 if((-d $filename and -s _)<512){}。因为文件测试返回布尔值和512比较的。

    4. statlast  函数

       通过文件测试操作符可以获取某个文件或文件句柄的常用属性, 但是并不能获取文件链接数和拥有者ID等等, 可以使用stat函数, 如果执行失败(通常是无效文件名或不存在) 返回空列表, 成功返回13个数字元素的列表.

    my($dev,$ino,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime, $blksize,$blocks) = stat($filename);

      $dev 和 $ino: 文件所在设备的编号和与文件的inode编号, 这两个编号决定文件的唯一性. 即使它具有不同的文件名(使用硬链接创建), 这个组合依然是唯一的.

      $mode : 文件的权限位集合, 八进制

      $nlink: 文件或目录的硬链接数, 也就是这个条目有多少个真实的名称. 

      $uid 和 $gid : 文件拥有者的用户编号以及组ID.

      $size: 以字节为单位的文件大小.

      $atime, $mtime, $ctime: 3种时间戳

    5. localtime() 

      使用 stat 等函数获得的时间戳值可以用 localtime 函数转换为容易让人阅读的形式.

    my($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst)=localtime($timestamp);

      返回值: $mon 是从0 开始计数的, 所以正确的值应该+1;  年份是从1900年至今的年份, 所以正确值应该+1900;  $yday 指目前是今年的第几天,范围从(0-365),从1月1日计算到12月31日.

      类似函数: 

         gmtime()和localtime()  返回世界标准时间(格林威治时间)

         time() 获取当前时间戳

    6.按位运算操作符.

      按位与或非左移右移异或, 完全和C相同.

      使用位字符串: 按位操作符可以操作整数(至少32位)和 位字符串 ,  如果按位运算的任意一个操作数是字符串, 则Perl会当成位字符串处理, 如:  "xAA" | "x55";  结果是:  "xFF" ; 这是在Perl中少数区分字符串和整数的地方. 

        

  • 相关阅读:
    c# 泛型集合Dictionary
    int+? int后带问题是什么意思,请看内容。
    在ASP.NET中实现Url ReWriting 示例
    #DataDirectory是什么意思呢?
    vs2008生成自定义dll,VS2008发布、生成网站时设置固定的dll文件名?
    平台安装注意事项
    快速开发平台程序运行环境
    快速开发平台介绍(动态)
    快速开发平台程序安装包20120612
    JavaFx 2.0总结
  • 原文地址:https://www.cnblogs.com/roger9567/p/4537804.html
Copyright © 2020-2023  润新知