Perl5中19个最重要的文件系统工具
在写脚本处理文件系统时,经常需要加载很多模块。其中好多有用函数分散在各种不同的模块中。它们有些是Perl的内置函数,有些是在同Perl一起发行的标准模块中,另外一些是通过CPAN安装的。
下面来看15个最常用的工具。
当前路径
我经常需要知道当前所在的文件夹是什么。Cwd 模块有一个同名但是小写的函数 cwd,它会返回当前工作目录。
- use strict;
- use warnings;
- use Cwd qw(cwd);
- print cwd, "\n";
临时文件夹
我经常需要创建一批临时文件,并且确保它们在脚本结束的时候会被自动删除。要满足这个需求,最简单的方法是以 CLEANUP 选项使用 File::Temp 模块的 tempdir 函数来创建一个临时文件夹。
- use strict;
- use warnings;
- use autodie;
- use File::Temp qw(tempdir);
- my $dir = tempdir( CLEANUP => 1 );
- print "$dir\n";
- open my $fh, '>', "$dir/some_file.txt";
- print $fh "text";
- close $fh;
与操作系统无关的路径
如果上面的代码要在 Linux 和 Windows 上都要运行,人们会习惯在 Windows 平台上用反斜线分割路径。否则,在VMS上不能执行。而这就是 File::Spec::Functions模块中catfile函数的用武之地。
- use strict;
- use warnings;
- use File::Spec::Functions qw(catfile);
- use File::Temp qw(tempdir);
- my $dir = tempdir( CLEANUP => 1 );
- print "$dir\n";
- print catfile($dir, 'some_file.txt'), "\n";
执行这个代码后,能看到临时文件夹被打印出来,紧跟其后的是文件名字。
切换目录
通常情况下,先切换工作目录到临时文件夹再进行操作会更简单。但是也存在其他情况的写测试。此时我们可以使用内置函数chdir。
- use strict;
- use warnings;
- use autodie;
- use File::Temp qw(tempdir);
- use Cwd;
- my $dir = tempdir( CLEANUP => 1 );
- print cwd, "\n";
- chdir $dir;
- print cwd, "\n";
- open my $fh, '>', 'temp.txt';
- print $fh, 'text';
- close $fh;
以上看起来可以正常工作,但是当File::Temp尝试删除文件夹,而我们仍然“在里面”(之前切换工作目录到它)时就会有问题。
例如,我会得到下面的错误信息:
cannot remove path when cwd is /tmp/P3DZP_rmqg for /tmp/P3DZP_rmqg:
为了避免这种情况,我通常会在切换目录之前保存cwd的返回值,并且在最后再次调用chdir。
- my $original = cwd;
- ...
- chdir $original;
这样仍然会有个小问题。如果我在脚本中间调用exit(),或者在执行到chdir $original之前抛出异常而终止脚本,会发生什么?
Perl提供了一个解决方案:把最后一个chdir包裹在END块中。如此,就会确保无论何时、以何种方式退出脚本,这些代码都会执行到。
- my $original = cwd;
- ...
- END {
- chdir $original;
- }
相对路径
当写一个多文件构成的项目(例如一个或多个脚本,多个模块,也可能是多个模板),并且我不想“安装”它们时,最好的目录组织方式是:确保每个文件都在一个固定的相对位置。
所以,我的项目目录通常会包含一个脚本子文件夹,一个模块文件夹(lib), 一个模板文件夹, 等等:
project/
scripts/
lib/
templates/
那么,如何才能确保脚本能够找到模板? 我有好几个处理办法:
- use strict;
- use warnings;
- use autodie;
- use FindBin qw($Bin);
- use File::Basename qw(dirname);
- use File::Spec::Functions qw(catdir);
- print $Bin, "\n"; # /home/foobar/Rocket-Launcher/scripts
- print dirname($Bin), "\n"; # /home/foobar/Rocket-Launcher
- print catdir(dirname($Bin), 'templates'), "\n"; # /home/foobar/Rocket-Launcher/templates
FindBin模块导出的参量$bin存放着当前脚本的目录路径。 在我们的例子中就是指向project/scripts/文件夹的路径。
File::Basename中的dirname函数会传入一个路径,并返回除最后一部分之外的路径。
最后一行File::Spec::Functions模块的catdir函数基本上和我们之前看到的catfile一样。
除了打印到屏幕上,当然也可以使用catdir的返回值来表示templates路径。
从相对路径中加载模块
大部分情况下,要查找和加载的模块都会在项目的lib/文件夹中。为此,我们会把之前的代码和lib指令连用。这样会改变@INC变量的值,把相对路径添加在数组开头。
- use strict;
- use warnings;
- use autodie;
- use FindBin qw($Bin);
- use File::Basename qw(dirname);
- use File::Spec::Functions qw(catdir);
- use lib catdir(dirname($Bin), 'lib');
- use Rocket::Launcher;
假定存在lib/Rocket/Launcher.pm文件。
Perl5中19个最重要的文件系统工具的更多相关文章
- 10、Perl5中19个最重要的文件系统工具
转载:http://www.cnblogs.com/nkwy2012/p/6027157.html 在写脚本处理文件系统时,经常需要加载很多模块.其中好多有用函数分散在各种不同的模块中.它们有些是Pe ...
- perl5 第十二章 Perl5中的引用/指针
第十二章 Perl5中的引用/指针 by flamephoenix 一.引用简介二.使用引用三.使用反斜线(\)操作符四.引用和数组五.多维数组六.子程序的引用 子程序模板七.数组与子程序八.文件句 ...
- 安全运维中基线检查的自动化之ansible工具巧用
i春秋作家:yanzm 原文来自:安全运维中基线检查的自动化之ansible工具巧用 前几周斗哥分享了基线检查获取数据的脚本,但是在面对上百台的服务器,每台服务器上都跑一遍脚本那工作量可想而知,而且都 ...
- ICC中对Skew进行Debug的好工具--Interactive CTS Window
本文转自:自己的微信公众号<集成电路设计及EDA教程> 以后打算交替着推送多种EDA工具的教程而不只是单纯针对某个工具,依次来满足不同粉丝的需求. 这里分享一篇多年之前写的推文,虽然时间 ...
- ubuntu12.04管理文件系统工具
ubuntu12.04管理文件系统工具 以前可以自动管理系统盘和移动硬盘,刚重新安装了UBUNTU12.04LTS之后不行了,原来是这个工具: "PCMANFM" 群星_-_偏偏喜 ...
- CMMI-4中19个PA的大致描述
组织过程资产库下面有组织级标准过程库, 这个库里一共有19各PA(就是标准过程啦) PA的英文是Process Area CM(配置管理过程,英文是Configuration Manage ...
- perl5中锚位修饰符\A \z \Z 和perl4中^(开头)和$(结尾)的区别
习惯使用perl4的开发者总是用^表示字符串开头锚位,用$表示字符串结尾锚位,比如\^https://\ 将会匹配所有以https://开头的字符串,同样,\.bmp$\将会匹配所有以.bmp结尾的字 ...
- Mac中的格式转换如何用读写工具Tuxera NTFS完成
Tuxera NTFS for Mac是一款专门为Mac用户提供的NTFS驱动软件,它不仅可以进行磁盘文件的访问.编辑.传输和存储,还可以对硬盘进行维修检查以及修复. 今天小编就给大家简单介绍一下Tu ...
- eclipse中如何安装插件ADT及SDK工具
1.如何在eclipse中安装ADT 首先下载ADT Plugin 下载地址: http://tools.android-studio.org/index.php/adt-bundle-plugin ...
随机推荐
- Spring JDBC保存枚举对象含关键字报错原因之一
报错信息: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized S ...
- 6.1:SportStore:一个真实的应用
之前的小例子让我们演示了AngularJS的一些特性,但他们缺少上下文.要解决这个问题,作者要创建一个简单单真实的电子商务应用. 作者将创建一个在线产品分类,客户可以通过分类和页面浏览,一个购物车用户 ...
- css中transition的使用以及:before:after的使用(小样式)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Android本机号码及Sim卡状态的获取
SIM卡存储的数据可分为四类:第一类是固定存放的数据.这类数据在移动电话机被出售之前由SIM卡中心写入,包括国际移动用户识别号(IMSI).鉴权密钥(KI).鉴权和加密算法等等.第二类是暂时存放的有关 ...
- SQL Server 索引和表体系结构(二)
转自:http://www.cnblogs.com/chenmh 非聚集索引 概述 对于非聚集索引,涉及的信息要比聚集索引更多一些,由于整个篇幅比较大涉及接下来的要写的“包含列的索引”,“索引碎片”等 ...
- Antenna Placement
Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7574 Accepted: 3762 Des ...
- JAVA基础知识之网络编程——-关于阻塞IO/非阻塞IO/同步IO/异步IO的一些参考文章
Java NIO之多个Selector的实现Java NIO类库Selector机制解析(上) Java NIO类库Selector机制解析(下) https://www.zhihu.com/ques ...
- 403.14-Forbidden Web 服务器被配置为不列出此目录的内容及Login on failed for "IIS APPPOOL\ASP.NET v4.0"问题
问题1: 发布mvc3报错:403.14-Forbidden Web 服务器被配置为不列出此目录的内容 折腾了半天,提示里面的解决方法是: 如果不希望启用目录浏览,请确保配置了默认文档并且该文件存在. ...
- android 入门 002 (拨打电话,发送短信)
一.拨打电话 1.首先做好界面,代码如下: layout =>activity_main.xml 中 <LinearLayout xmlns:android="http://sc ...
- MVC 过滤器