Chinaunix首页 | 论坛 | 博客
  • 博客访问: 858783
  • 博文数量: 253
  • 博客积分: 6891
  • 博客等级: 准将
  • 技术积分: 2502
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-03 11:01
文章分类

全部博文(253)

文章存档

2016年(4)

2013年(3)

2012年(32)

2011年(184)

2010年(30)

分类: Python/Ruby

2011-07-28 13:11:46

change dir
chdir 可以改变工作目录。它和Unix shell 下的cd 命令类似:
chdir “/etc”or die “cannot chdir to /etc: $!”;
由于这是系统请求,错误发生时将给变量$!赋值。通常应当检查$!的值,因为它将告诉你chdir 失败的原因。
工作目录会被Perl 启动后的所有进程所继承(我们在第十四章将更详细的讨论)。但是,对于调用Perl 的进程的工作目录将不会改变,例如shell◆。因此,不能写一个Perl 程序来代替shell 下的cd 命令。

Globbing
  1. my @files = glob "*.pl";
  2. foreach $args (@files){
  3.     print "one arg is $args\n";
  4. }
将得到以.pl结尾的所有文件

目录句柄
目录句柄外形及其行为都很像文件句柄。打
开(使用opendir 而非open),从中读入(使用readdir 而非readline),关闭(使用closedir 而非close)。不是读入文件的内
容,而是将一个目录中的文件名(以及一些其它东西)读入,如下例:
  1. my $dir_to_process =/etc”
  2. opendir DH, $dir_to_process or die “Cannot open $dir_to_process: $!;
  3. foreach $file(readdir DH) {
  4. print “one file in $dir_to_process is $file\n”;
  5. }
  6. closedir DH;
删除文件
在Perl 中,我们使用unlink:
unlink “slate”, “bedrock”, “lava”;一次删掉多个文件:
unlink glob “*.o”;
unlink 返回值告诉我们成功删除的文件数。回到第一个例子,我们可以检验其是否成功:
my $successful = unlink “slate”, “bedrock”, “lava”;
print “I deleted $successful file(s) just now\n”

重命名文件
将一个给定文件重命名可以很简单的使用rename 函数做到:
rename “old”, “new”;
怎样将所有的以.old 结尾的文件重名命名为以.new 结尾的文件。
下面是Perl 的做法:
  1. #!/usr/bin/perl
  2. #
  3. $dir = shift;
  4. chdir $dir or die "cannot change to the dir $dir: $!";

  5. @old = glob "*.new";

  6. foreach $file (@old){
  7.         $oldfile = $file;
  8.         $file =~ s/\.new$/.old/;
  9.         if(-e $file){
  10.                 warn "cannot rename $oldfile to $file:$file exists\n";
  11.         }elsif(rename $oldfile, $file){
  12.         }else{
  13.                 warn"rename $oldfile to $file failed:$!\n";
  14.         }
  15. }
检测是否存在$newfile 的文件是需要的,因为rename 将会立刻重命名某个文件,无论是否存在同名的文件,假定用户有权限将以前的文件删除。我们在这里进行检测的目的,就是减少这类情况所引起的信息丢失。如果想要替换一个已经存在的文件,
以上赋值 也可以(my $newfile = $file) =~ s/\.old/.new/;先把$file 赋给 $newfile, 再对$newfile进行替换。

连接和文件
link“chicken”, “egg”;
or warn “Can’t link chicken to egg: $!”;
这和在Unix 的shell 提示符后输入ln chicken egg 的结果是差不多的。如果link 成功,则返回true。如果失败,则返回false,并将失败的原因赋给$!

symlink “dodgson”, “carroll”;
or warn “Can’t sysmlink Dodgson to carroll: $!”;
这同巴尼在shell 中使用ln –s dodgson carroll 的结果是一样的。
要找出符号连接指向的地方,使用readlink 函数。它会告诉你符号连接指向的地方,如果参数不是符号连接其返回undef:
my $where = readlink “carroll”; #得到“dodgson”
my $perl = readlink“/usr/local/bin/perl”#可能得到Perl 放置的地方
可以使用unlink 删除任意类型的连接。现在,你知道这个操作为什么得到这个名字了吧。unlink 删除目录中给定文件名的实体,符号连接减1,也有可能释放掉相应的索引接点。

创建和删除目录
在一个目录下创建新目录是很容易的。使用mkdir 函数:
mkdir “fred”, 0755 or warn “Cannot make fred directory: $!”;
true 意味着成功,$!会在失败时被置值。
要删除一个空的目录,按照类似于unlink 函数的方法使用rmdir 函数:
rmdir glob “fred/*”; #删除fred/下面所有的空目录
foreach my $dir (qw(fred barney betty)){
rmdir $dir or warn “cannot rmdir $dir: $!\n”;
}
和unlink 一样,rmdir 返回删除的目录个数,如果一次删除一个,则会在失败时设置合理的$!值。

修改权限
Unix 的chomd 命令可以改变文件或目录的权限。同样的,Perl 的chomd 函数也能完成这种任务:
chmod 0755, “fred”, “barney”;

改变所有者
如果操作系统允许,你可以使用chown 函数改变一批文件的所有者及所在的组。所有者及组是同时改变的,它们两个分别有一个数字值user-ID 及group-ID。例如:
my $user = 1004;
my $group = 100;
chown $user, $group, glob “*.o”
如果你有一个像melryn 这样的用户名,而没有数字,怎么办?调用getpwnam 函数,将名字转换为数字,而对应的getgrnam

defined(my $user = getpwnam “merlyn”) or die “bad user”;
defined(my $group = getprnam “users”) or die “bad group”;
chown $user, $group, glob “/home/Merlyn/*”;
defined 函数验证返回值是否为undef,如果请求的user 或group 不存在,则返回undef。



阅读(662) | 评论(0) | 转发(0) |
0

上一篇:文件检测操作

下一篇:字符串

给主人留下些什么吧!~~