查看原文
其他

程序没法运行就是脚本没写好?文件测试和目录操作很重要!

晨光 生信者言 2022-03-29


阅读用时:全文共2部分,约1900字,约5分钟

关键词:Perl语言,文件测试,目录操作




上周在后台收到小伙伴的深情呼唤,所以晨光又来跟大家分享perl语言的知识点啦!


现在我们的perl系列已经进行了6次知识点讲解,并配以两次实例讲解,大家是否已经可以自己写脚本了呢?


那么问题来了!在读取和生成文件之前,我们需要判断目标文件是否存在,或者需要获取文件的权限等信息;另外,我们也会对工作目录进行创建和删除等操作,这就涉及到文件测试和目录操作的问题了。

 

《Perl零零八速成系列》(共8节课)主要是面向无Perl编程经验或者Perl语言初学者,介绍Perl的基本知识和实用编程技巧。晨光与你一路,轻松点亮编程技能,一跃成为特工级的Perl编程牛人!

【前情回顾】

《Perl零零八速成系列---数据结构入门》

《Perl零零八速成系列---哈希和子函数》

《化腐朽为神奇,编程语言不可错过之正则表达式》

《实例精解!如何从海量序列信息中提取目标序列》

《Perl零零八速成系列---字符串操作与排序》

《实用案例精讲!如何用perl写一个截序列的脚本?》

《Perl 语言输入、输出怎么写?控制结构如何用?看这一篇就够了!》


【本节内容】

本节内容包括Perl 语言的文件测试和目录操作。


一、文件测试

 

1、文件测试操作符

Perl 提供了一组用于测试文件的操作符,借以返回特定的文件信息。绝大多数测试操作符返回布尔值。例如,可以用 -e 测试操作符测试文件是否存在,-M 测试操作符返回文件最后一次修改时间到当前程序启动时间之间的天数。代码如下:


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

#检测文件$filename是否存在

 

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

#检测CONFIG文件最后一次修改时间是否大于28天


这里我们列出了常用的文件测试操作符及其意义,供大家学习:


表1. 文件测试操作符及其意义



2、栈式文件测试操作符


如果我们要一次测试多个文件属性(比如可读、可写),可以分别做测试,例如:

if (-r $file and -w $file) { ... }

 

又或者:

if (-r $file and -w _) { ... }

 

其中下划线(_)是虚拟文件句柄,它会告诉Perl用上次查询过的文件信息来做当前测试,这样可以节省重复读取文件信息的时间。

 

如果可以一次完成多项属性的测试,那岂不是更省事?Perl 5.10开始允许使用“栈式(stack)”写法将文件测试操作符排成一行,同时进行多项属性的测试:

 

use 5.010;

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

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

}

 


3、stat函数


Perl下的stat函数和shell下的stat命令的功能基本一致,也是取得文件的各类具体信息。stat()函数返回一个数组,下面是数组各个元素的含义:

 

表2. stat返回格式及其含义



4、localtime函数

 

localtime函数根据它所在的上下文,可以用两种完全不同的方法来运行。在标量上下文中,localtime函数返回一个格式化很好的当前时间字符串:

 

表3. localtime返回格式及其含义

 

例如: 


#!/usr/bin/perl 


my  ($sec,$min,$hour,$mday,$mon,$year) =(localtime)[0..5];

($sec,$min,$hour,$mday,$mon,$year)= (

    sprintf("%02d", $sec),

    sprintf("%02d", $min),

    sprintf("%02d", $hour),

    sprintf("%02d", $mday),

    sprintf("%02d", $mon + 1),

    $year + 1900

);

print "$year-$mon-$mday $hour:$min:$sec/n";


运行结果:

2017-11-1213:37:31/n

 

 

二、目录操作

 

Perl在默认情况下是在当前工作目录进行操作,但是有时候我们希望对工作目录进行更换,这时候可以直接对目录进行操作。



1、在目录树中移动


 

我们可以使用chdir 函数来切换当前工作目录,执行该操作需要有足够权限。


实例如下:

 

#!/usr/bin/perl

 

$dir ="/home";

# 将当期目录移动到/home 目录下

chdir( $dir )or die "无法切换目录到 $dir , $!";

print "你现在所在的目录为$dir\n";

 

运行结果:

你现在所在的目录为 /home

 


2、显示所有的文件



如果我们想显示当前目录下的所有文件,可以使用glob 操作符来实现:

 

#!/usr/bin/perl

 

# 显示 /tmp 目录下的所有文件

$dir ="/tmp/*";

my @files =glob( $dir );

 

foreach(@files ){

   print $_ . "\n";

}



3、目录句柄


 

如果我们想从目录里取得文件名列表,还可以使用目录句柄:

 

#!/usr/bin/perl

 

opendir (DIR,'.') or die "无法打开目录, $!"; 

# opendir打开目录句柄DIR

while ($file =readdir DIR) {  

#readdir获取目录中的文件列表

  print "$file\n";

}

closedir DIR; 

#关闭目录句柄

 


4、创建和删除目录


 

我们可以使用 mkdir 函数来创建一个目录或rmdir 函数删除一个目录,执行前你需要有足够的权限:

 

mkdir 'fred', 0755 or warn "Cannotmake fred directory: $!";

 

foreach my$dir (qw(fred barney betty)) {

rmdir $dir or warn "cannot rmdir $dir: $!\n";

}

 

PS: 0755表示目录建立时的初始权限



5、删除和重命名文件


 

我们通常会对文件进行删除操作,在Perl里面,我们可以使用unlink函数来实现:

 

unlink 'slate', 'bedrock', 'lava';              #删除三个文件

 

或者用qw()列出文件列表,即:

 

unlink qw(slate bedrock lava);

 

PS: unlink只能用来删除文件,不能用来删除目录,它的返回值代表成功删除的文件数目。

 

除此之外,我们还可以用rename函数进行重命名操作:

 

rename 'old' 'new'



6、修改权限和隶属关系


 

我们知道Linux系统中的chmod和chown命令,分别可以用来修改文件、目录的权限和隶属关系。在Perl里面对应的chmod和chown函数也有同样的功能。

 

chmod 0755,'fred', 'barney';          #修改文件的权限为0755

 

my $user =1004;

my $group =100;

chown $user,$group, glob '*.o';    #修改所有以'.o'结尾文件的拥有者和所属组

 

PS: chomd和chown函数会返回成功修改文件的个数

 

 

处理好输入问题是一个程序正常运行的首要条件。这里我尽量精简的介绍了常见的文件测试和目录操作。由于篇幅有限,难以深入展开说明,谨以此文,送与初入门Perl语言的朋友们。

 

下一节课我们来聊聊,perl模块安装与使用,敬请大家关注!



参考资料:

《Perl语言入门第六版(中文版)》

http://www.runoob.com/perl/perl-tutorial.html

http://www.runoob.com/try/runcode.phpfilename=HelloWorld&type=perl



/End.




生信者言推荐阅读

点击下方图片即可阅读

扫码关注,获取更多精彩内容

喜马拉雅FM搜索并订阅:生信者言;收听内容:

《一分钟听懂NGS基础概念》,让生信分析不再遥不可及

《亲爱的姑娘,你值得被温柔以待》,11个真实的人物故事

《众病之王:癌症传》,一起聆听人类对抗癌症的斗争史

回复文字:果然科学,看一篇好玩的科普文。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存