文件测试操作符及其意义

文件测试操作符 意义
-r 文件或目录,对目前(有效的)用户或组来说是可读的
-w 文件或目录,对目前(有效的)用户或组来说是可写的
-x 文件或目录,对目前(有效的)用户或组来说是可执行的
-o 文件或目录,由目前(有效的)用户拥有
-R 文件或目录,对实际的用户或组来说是可读的
-W 文件或目录,对实际的用户或组来说是可写的
-X 文件或目录,对实际的用户或组来说是可执行的
-O 文件或目录,对实际的用户拥有
-e 文件或目录,是存在的
-z 文件存在而且没有内容(对目录来说永远为假)
-s 文件或目录存在而且有内容(返回值是以字节为单位的文件大小)
-f 是普通文件
-d 是目录
-l 是符号链接
-S 是socket类型的文件
-p 是命名管道,也就是先入先出(fifo)队列
-b 是块设备文件(比如某个可挂载的磁盘)
-c 是字符设备文件(比如某个I/O设备)
-u 文件或目录设置了setuid位
-g 文件或目录设置了setgid位
-k 文件或目录设置了sticky位
-t 文件句柄是TTY设备(类似系统函数isatty()的测试,不能对文件名进行次测试)
-T 看起来像文本文件
-B 看起来像二进制文件
-M 最后一次被修改后至今的天数
-A 最后一次被访问后至今的天数
-C 最后一次文件节点编号(inode)被变更后至今的天数

测试同一文件的多项属性

1.写一个程序,从命令行取得一串文件名,并汇报这些文件是否可读,可写,可执行以及是否确实存在.

foreach my $file(ARGV){my $attribs = &attributes($file);print "'$file' $attribs.\n";
}
sub attributes{#报告某个给定的文件的属性return $file = shift @_;
return "does not exist" unless -e $file;
my @attrib;
push @attrib,"readable" if -r $file;
push @attrib,"writable" if -w $file;
push @attrib,"executable" if -x @file; return "exists" unless @attrib;
'is' .join ' and ', @attrib;
}

2.写一个程序,从命令行参数指定的文件中找出最旧的文件并且以天数汇报它已存在了多久.若列表是空的(也就是命令行中没有提及任何文件),那么它该做什么?

die "No file names supplied!\n" unless @ARGV;
my @oldest_name = shift @ARGV;
my $oldest_age = -M $oldest_name;
foreach(@ARGV){my $age =  -M;(@oldest_name, @oldest_age) = ($_,$age)if $age > $oldest_age;}
printf "The oldest file was %s,and it was %.1f days old.\n",$oldest_name, $oldest_age;
}

3.写一个程序,用栈式文件测试操作符列出命令行参数指定的所有文件,看看拥有者是否是你自己,以及它们是否可读,可写.

use 5.010;
say "Looking for my files that area readable and writabled";die "No files specified!\n" unless @ARGV;foreach my $file(@ARGV){sat "$file is readable and writeable" if -o -r -w $file;
}

在目录树中移动

程序运行是会以自己的工作目录(working directory)作为相对路径的起点.也就说,当我们提及fred这个文件时.其实指的是"当前工作目录下的fred".

你可以用chdir来改变当前的工作目录.它和Unix shell的cd命令差不多:

chdir ‘/etc’ or die “cannot chdir to /etc: $!”;

由Perl程序启动的所有进程都会继承Perl程序的工作目录.可是工作目录的更改却无法影响调用Perl程序的进程比如shell.这意味着你没办法写出可以替代shell里的cd命令的Perl程序,因为一旦退出Perl程序,又会回到启动Perl程序时所在的工作目录.

$echo .pm
barney.pm dino.om fred.pm wilma.pm
这里的echo命令其实斌不知道如何展开
.pm,因为shell会先把*.pm展开成一些符合条件的文件名然后再交给他处理.这对Perl程序来说也是一样的.

运行程序时,如果只有一个带有文件名通配符的参数shell会先展开该通配模式,再把结果传递给程序,这样,对程序来说,就好比是看到多个参数.

不过有时候在程序内部也可能需要用*.pm之类的模式.我们可以不用花太多力气就把它展开成相匹配的文件名吗?只要用glob操作符就行了:

my @all_files = glob ‘*’;
my @pm_files = glob ‘*.pm’;

这样说来,加入尖括号既表示从文件句柄读取又代表文件通配操作,那Perl又是如何判断取舍的呢?因为合理的文件句柄必须是严格意义上的Perl标识符,所以如果尖括号内满足Perl标识符条件的,就作为文件句柄来读取;否则,它代表的就是文件名通配操作.

目录句柄

若想从目录里取得文件名列表还可以使用目录句柄,目录句柄看起来像文件句柄,使用起来也没多大差别.

my $dir_to_process = '/etc';
opendir my $dh,$dir_to_process or die "Cannot open $dir_to_process: $!";
foreach $file (readdir $dh){print "one file in $dir_to_process is $file\n";
}
closedir $dh;

替换运算中左边的点号之前有反斜线,而右边却没有.其实这是因为两边的意义不同,左边的部分是正则表达式,右边的则可视为双引号内的字符串.

开发日记-20190716 关键词 读书笔记 《Perl语言入门》Day 10相关推荐

  1. 开发日记-20190710 关键词 读书笔记 《Perl语言入门》Day 7

    Preface Content 用m//进行匹配 我们用双斜线的写法表示模式,比如/fred/.但事实上,这是m//(pattern match operator,模式匹配操作符)的简写. 但是尖括号 ...

  2. 开发日记-20190708 关键词 读书笔记 《Perl语言入门》Day 5

    Preface 进度两章,看来搞定这本书真的是需要话一些时间的.十天左右吧.怪我没弄实体书呗. Content 我们已见过并用过一些内置的系统函数,像chomp,reverse和print等. 但是, ...

  3. 开发日记-20190706 关键词 读书笔记 《Perl语言入门》Day 3

    Preface 感觉Perl上下文的概念其实挺有意思的,有点像大陆法系和英美法系之间的关系那样扑朔迷离.Perl的感觉在目前给我的感觉是,他更相信人,他认为只要是实际的操作者用的更爽,那这个东西就是最 ...

  4. 开发日记-20190705 关键词 读书笔记 《Perl语言入门》Day 2

    Preface Content 运行程序时,Perl内部的编译器会先载入整个源程序,将之转换成内部使用的bytecode,这是一种Prel在内部用来表示程序语法树的数据结构,然后交给Perl的byte ...

  5. 开发日记-20190709 关键词 读书笔记 《Perl语言入门》Day 6

    Preface 麻麻,今天Perl进度推进了两章,Linux进度推进了一章,我这下班进度.高起来我自己都吓一跳.早点睡觉吧!还有,用知识武装自己,而不是欲望. Content 什么是正则表达式? 正则 ...

  6. 开发日记-20190707 关键词 读书笔记 《Perl语言入门》Day 4

    Preface 呵,这脸打的真的是啪啪直响,我自己说的话其实我自己是记得最清楚的.今天都已经是第四天了,进度也只到第三章,真的,还是待在公司最有感觉. Content 自己写了一遍第三章的答案,然后对 ...

  7. 开发日记-20190717 关键词 读书笔记 《Perl语言入门》Day 11

    Preface 我在想,是不是有什么东西,我渐渐忽略了自己的想法,我自己到底愿意成为自己所期望的什么样的样子,我所考虑的,是不是应该无视自己内心的那样的无可奈何的,不为人知的孤独感,我迷茫着,自己是不 ...

  8. 开发日记-20190715 关键词 读书笔记 《Perl语言入门》Day 9

    第九章习题 1.建立起一个模式,无论what的值是什么,它都可以匹配三个what的值是什么,它都可以匹配三个what的值是什么,它都可以匹配三个what的内容连在一起的字符串.也就是说,若果what的 ...

  9. 开发日记-20190712 关键词 读书笔记 《Perl语言入门》Day 8

    Preface 明天就是Fate大电影上映的时间了,好激动= = Content 列表上下文的m// 在使用split时,模式指定的正是分隔符:分解得到的字段未必就是我们需要的数据.有时候,指定想要留 ...

最新文章

  1. 统一账号/统一认证系统的引入和搭建(LDAP)
  2. uCOS-II 学习笔记--------OSInit函数
  3. 论文笔记:Image Caption(Show and Tell)
  4. mysql分库分表方案浅析
  5. Unity2017.1官方UGUI文档翻译——Auto Layout
  6. 听完了61课的IT播吧,这是我整理的学习笔记。
  7. womic网络错误_WO Mic驱动程序下载
  8. CSS3-3D变换 transform-style:preserve-3d
  9. 性能分析26-tomcat优化P61
  10. Input length must be multiple of 8 when decrypting with padded cipher 错误
  11. spring-boot2 + vue2+element-ui + avue + uni-app (兮家开源商城)
  12. 【系统篇 / 域】❀ 06. Windows10 加入域 ❀ Windows Server 2016
  13. 服务器遭到newinit.sh木马挖矿攻击记录
  14. Ajax --- 获取服务器端的响应
  15. 【行业排名】第三方支付平台有哪些?第三方支付平台排名
  16. QC手法在软件中的运用
  17. Windows优化大师使用技巧
  18. 利用Aspose.Words编辑word生成pdf
  19. STPRSTPMSTP(1)
  20. 【帆软】调整软件字体大小

热门文章

  1. 计算机组成原理两数相加指令,计算机组成原理复习题
  2. java compareto方法怎么排序的_深入理解Java中Comparable和Comparator排序
  3. nuke linux 插件,Nuke 插件:镜头光晕 Optical Flares v1.0.86(含预设)Win/Mac/Linux
  4. mysql查询去重第一条_Mysql用法记录 - Ashley-OSCHINA的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. golang模板与json的应用
  6. 拉勾网《32个Java面试必考点》学习笔记之一------Java职业发展路径
  7. linux java乱码怎么解决,linux中显示中文乱码如何解决
  8. java 取pdf表格内容数据_Java 在PDF中添加表格
  9. 字符串对象转数组对象_js对象转数组的方法 js怎么将数组对象转变成字符串
  10. 空气培养皿采样后保存_环境监测基础知识——环境空气监测技术之布点采样