perl中目录句柄的操作(opendir, readdir, closedir)

来源:互联网 发布:代源码迅雷 编辑:程序博客网 时间:2024/06/07 20:10

从给定目录得到其文件名列表的方法还可以使用目录句柄(directory handle)。目录句柄外形及其行为都很像文件句柄。打开(使用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 以前的版本中,globbing 它会调用别的进程;目录句柄不会,因此它更有效率,能更有效的利用系统资源。但是,这是一种底层(lower-level)的操作,意指我们需要自己处理更多的事情。

while ($name = readdir DIR) {
next unless $name =~ //.pm$/;
… more processing…
}
上述的语法是正则表达式而非glob。如果想要所有的非点(non-dot)文件(不是由点开头的文件),可以使用:

next if $name =~ /^/./;

如果想要除了通常的点(当前目录)以及点点(父目录)之外的所有文件,我们可以明确地使用下面的语句:

next if $name eq “.”or $name eq “ ..”;

现在我们讨论最容易混淆的部分,请打起精神来。readdir 操作返回的文件名没有路径名部分,而只是文件名。因此,我们的得到的不是/etc/passwd而是 passwd。由于这又是一个不同于 globbing 的地方,人们也经常在这里出现混淆。
你需要将路径名加上,以得到文件的全名(路径名+文件名):

opendir SOMEDIR, $dirname or die “ Cannot open $dirname: $!” ;
while (my $name = readdir SOMEDIR) {
next if $name =~ /^/./; #跳过点文件
$name = “ $dirname/$name” ; #加上目录名
next unless– f $name and – r name; #除非是可读文件如果没有加上目录名,则测试部分将只检测当前目录下的文件,而不是$dirname 下的文件。这是使用目录句柄最常犯的一个错误

原创粉丝点击