10、Perl5中19个最重要的文件系统工具
转载:http://www.cnblogs.com/nkwy2012/p/6027157.html
在写脚本处理文件系统时,经常需要加载很多模块。其中好多有用函数分散在各种不同的模块中。它们有些是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文件
10、Perl5中19个最重要的文件系统工具的更多相关文章
- Perl5中19个最重要的文件系统工具
在写脚本处理文件系统时,经常需要加载很多模块.其中好多有用函数分散在各种不同的模块中.它们有些是Perl的内置函数,有些是在同Perl一起发行的标准模块中,另外一些是通过CPAN安装的. 下面来看15 ...
- perl5 第十二章 Perl5中的引用/指针
第十二章 Perl5中的引用/指针 by flamephoenix 一.引用简介二.使用引用三.使用反斜线(\)操作符四.引用和数组五.多维数组六.子程序的引用 子程序模板七.数组与子程序八.文件句 ...
- Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构
分享两篇Win 10应用开发的XML文档结构:Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构. Win 10 开发中Adapt ...
- XE6移动开发环境搭建之IOS篇(7):在Mac OSX 10.8中安装Xcode4.6.3(有图有真相)
网上能找到的关于Delphi XE系列的移动开发环境的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 在安装Xcode前, ...
- XE6移动开发环境搭建之IOS篇(7):在Mac OSX 10.8中安装XE6的PAServer(有图有真相)
XE6移动开发环境搭建之IOS篇(7):在Mac OSX 10.8中安装XE6的PAServer(有图有真相) 2014-08-22 21:06 网上能找到的关于Delphi XE系列的移动开发环境的 ...
- XE6移动开发环境搭建之IOS篇(8):在Mac OSX 10.8中安装XE6的PAServer(有图有真相)
网上能找到的关于Delphi XE系列的移动开发环境的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 安装PAServer ...
- 在Mac OS X 10.8中配置Apache + PHP + MySQL
在Mac OS X 10.8中配置Apache+PHP+MySQL的内容包括: 配置Apache 配置PHP 安装MySQL 配置PHPAdmin 设置数据库默认字符集 一. 配置Apache 1. ...
- 在ArcMap 10.3中创建和编辑数据
在ArcMap 10.3中创建和编辑数据 .......待补充 新建 创建一个新文件((Points, Polylines, and Polygons/点.线.多边形)
- MyEclipse 10.x中拓展自动提示功能
原文转自:MyEclipse 10.7中拓展自动提示功能 在myeclipse 9以前的版本中,我们如果要为html编辑器添加自动的代码提示可以这样操作: 1.windows-->prefere ...
随机推荐
- leetcode 1049 Last Stone Weight II(最后一块石头的重量 II)
有一堆石头,每块石头的重量都是正整数. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 x <= y.那么粉碎的可能结果如下: 如果 x == y,那么 ...
- Spark Structured Streaming框架(4)之窗口管理详解
1. 结构 1.1 概述 Structured Streaming组件滑动窗口功能由三个参数决定其功能:窗口时间.滑动步长和触发时间. 窗口时间:是指确定数据操作的长度: 滑动步长:是指窗口每次向前移 ...
- http keep-alive简解
http协议中,客户端发送请求,服务端在接收到请求后,返回所需要的数据后可以关闭连接,这样客户端读取完数据时会返回EOF(-1),表明数据已接受完全 备注:EOF end of file 什么是kee ...
- 【DP】最长不下降子序列问题(二分)
Description 给你一个长度为n的整数序列,按从左往右的顺序选择尽量多的数字并且满足这些数字不下降. Thinking 朴素dp算法:F[i]表示到第i位为止的最长不下降子序列长度 F[i]= ...
- hd acm1048
Problem Description Julius Caesar lived in a time of danger and intrigue. The hardest situation Caes ...
- float元素的父元素自适应高度
当在对象内的盒子使用了float后,导致对象本身不能被撑开自适应高度,这个是由于浮动产生原因. 如何解决父div对象自适应高度,方法有三种. 1.对父元素设置固定高度 2.使用clear清除浮动 3. ...
- EntityFramework 学习 一 DbContext
上一节中EDM自动生成SchoolEntities类,该类继承DbContext EntityFramework4.1之前的版本,EDM生成的类继承ObjectContext,使用ObjectCont ...
- oracle 从select的结果update其他表
update a set a.id=(selelct b.id from temp b where b.line = a.line) where a.line = (select line from ...
- TortoiseGit做push时提示Disconnected: No supported authentication methods available (server sent: publickey)错误
通过Git从远程服务器上获得到自己的项目,但是通过TortoiseGit做push时提示Disconnected: No supported authentication methods availa ...
- BZOJ 3943 [Usaco2015 Feb]SuperBull:最大生成树
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3943 题意: 有n只队伍,每个队伍有一个编号a[i]. 每场比赛有两支队伍参加,然后选一支 ...