change dir chdir 可以改变工作目录。它和Unix shell 下的cd 命令类似:
chdir “/etc”or die “cannot chdir to /etc: $!”;由于这是系统请求,错误发生时将给变量$!赋值。通常应当检查$!的值,因为它将告诉你chdir 失败的原因。
工作目录会被Perl 启动后的所有进程所继承(我们在第十四章将更详细的讨论)。但是,对于调用Perl 的进程的工作目录将不会改变,例如shell◆。因此,不能写一个Perl 程序来代替shell 下的cd 命令。
Globbing
- my @files = glob "*.pl";
-
foreach $args (@files){
-
print "one arg is $args\n";
-
}
将得到以.pl结尾的所有文件
目录句柄目录句柄外形及其行为都很像文件句柄。打
开(使用opendir 而非open),从中读入(使用readdir 而非readline),关闭(使用closedir 而非close)。不是读入文件的内
容,而是将一个目录中的文件名(以及一些其它东西)读入,如下例:
- my $dir_to_process = “/etc”
-
opendir DH, $dir_to_process or die “Cannot open $dir_to_process: $!”;
-
foreach $file(readdir DH) {
-
print “one file in $dir_to_process is $file\n”;
-
}
-
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 的做法:
- #!/usr/bin/perl
-
#
-
$dir = shift;
-
chdir $dir or die "cannot change to the dir $dir: $!";
-
-
@old = glob "*.new";
-
-
foreach $file (@old){
-
$oldfile = $file;
-
$file =~ s/\.new$/.old/;
-
if(-e $file){
-
warn "cannot rename $oldfile to $file:$file exists\n";
-
}elsif(rename $oldfile, $file){
-
}else{
-
warn"rename $oldfile to $file failed:$!\n";
-
}
-
}
检测是否存在$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。
阅读(655) | 评论(0) | 转发(0) |