Perl学习之目录操作

Perl学习之目录操作

作者:银子
一、在目录树上移动

程序在某个工作目录(working directory)下运行,这是相对路径的起点。

chdir可以改变工作目录。它和Unix shell,Win command下的cd命令类似。


chdir "/test" or die "打开目录出错:$!";

错误发生时将给变量$!赋值。通常应当检查$!的值,因为它将告诉你chdir失败的原因。

工作目录会被Perl启动后的所有进程所继承。但是对于调用Perl的进程的工作目录将不会改变,因此,不能写一个Perl程序来代替shell下的cd命令。

二、Globbing

通常,shell将每个命令行中的任何的文件名模式转换成它所匹配的文件名。这被称作globbing。例如,在echo命令后使用了文件名模式*.pm,shell会将它转换成它所匹配的文件名。


my @all_files = glob "*";
foreach $v (@all_files)
{
print $v."\n";
}
@all_files得到了当前目录下的所有文件,这些文件按照字母排序的,不包括由点(.)开头的文件。


my @all_files = glob ".* *";
foreach $v (@all_files)
{
print $v."\n";
}
这里,我们包括了额外的 点星号(.*) 参数,来得到所有的文件(由点开头的文件,以及不由点开头的文件)。引号中两个项之间的空隔是必须的。


三、Globbing的替换语法

虽然我们任意的使用globbing这个术语,我们也谈论glob操作,但在许多使用globbing的程序中并没有出现glob这个字眼。为什么呢?原因是,许多这类代码在glob操作被命名前就写好了。它使用一对尖括号(<>),和从文件句柄读入操作类似。


my @all_files = <*>;
foreach $v (@all_files)
{
print $v.”\n”;
}
NOTE:尖括号中的值同双引号中的值一样,会被内插。

四、目录句柄

从给定目录得到其文件名列表的方法还可以使用目录句柄(directory handle)。目录句柄外形及其行为都很像文件句柄。打开(使用opendir 而非open),从中读入(使用readdir 而非readline),关闭(使用closedir 而非close)。不是读入文件的内容,而是将一个目录中的文件名(以及一些其它东西)读入。

五、递归的目录列表

Perl有一个叫做File::Find 的库,通过它你可以对递归的目录进行处理。

六、操作文件和目录

Perl通常用来处理文件和目录。由于Perl产生于Unix,如今它的大多数应用仍在这上面。

七、删除文件

在Perl中,我们使用unlink来删除文件。


unlink glob "*.htm";#彻底删除当前目录下所有的htm文件

unlink返回值告诉我们成功删除的文件数。


my $successful = unlink glob "*.htm";
print "删除了 $successful 个文件\n";

当某个特定的unlink失败时,$!变量会被设成相应的操作系统错误,我们将它包含在消息之中。这只在一次针对一个文件名进行处理时才有效,因为下一个操作系统错误会重置它。

NOTE:你不能使用unlink 来删除一个目录。

八、重命名文件

将一个给定文件重命名可以使用rename函数。


rename "5.html","6.html";

NOTE:可以在不同的目录之间操作。

九、连接和文件

link函数创建了一个新的连接。

unlink删除任意类型的连接。

十、创建和删除目录

使用mkdir函数创建目录:


mkdir "luoliang",0777 or warn "error: $!";

第一个参数是目录名称,第二个参数是设置目录权限。

使用rmdir函数删除目录:


rmdir "luoliang";

删除了刚才新建的luoliang目录

十一、修改权限

chomd函数用来修改文件或目录的权限:


mkdir "luoliang",0777 or warn "Error:$!";#创建一个新目录,权限为所有权限
chmod 0666,"luoliang";#修改目录权限

十二、改变所有者

使用chown函数改变一批文件的所有者及所在的组。


my $user = 1004;
my $group = 100;
$v = chown $user, $group, glob "*.htm";
print "$v个文件被修改用户组";

NOTE:如果你有一个像user这样的用户名,而没有数字怎么办?调用getpwnam函数,将名字转换为数字,而对应的getgrnam将组名转换为数字。

十三、改变时间戳

utime函数可以用来修改文件最近修改的时间以及被访问的时间。


my $now = time;
my $ago = $now-24*60*60; #一天前
utime $now, $ago, glob "luoliang"; #设成当前访问的,一天之前修改的

NOTE:第三个时间戳(ctime的值)永远是now,因此不能通过使用utime函数来设置它。

转载于:https://www.cnblogs.com/ec04/archive/2012/11/20/2779417.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值