目录句柄

目录句柄和文件句柄类似,可以打开它,并读取或迭代目录中的文件列表。只不过需要使用:

  • opendir替换open函数
  • 使用readdir来替换readline,readdir在列表上下文返回一个文件列表,在标量上下文则迭代读取下一个文件名
    • readdir不会递归到子目录中
    • readdir取得的文件名不包含父目录自身,只包含它所读取目录内的文件名部分
  • 使用closedir来替代close
  • 注意每个Unix的目录下都包含两个特殊目录...

注:除了打开目录句柄读取目录中的文件名外,还可以通过通配模式来匹配或迭代文件。

例如:

$dir = "/usr/local/java";
opendir JAVAHOME, $dir
    or die "Can't open dir: $!";
    
foreach $file (readdir JAVAHOME){
    say "filepath: $dir/$file";
}
closedir JAVAHOME;

从Perl v5.012版本开始,可以直接在while循环中使用readdir。例如:

use 5.012;

$dir = "/usr/local/java";
opendir(my $dh, $dir) || die "Can't open $dir: $!";
while (readdir $dh) {
  say "filepath: $dir/$_";
}
closedir $dh;

如果想要跳过...这两个特殊的目录,需要加上判断:

use 5.012;

$dir = "/usr/local/java";
opendir(my $dh, $dir) || die "Can't open $dir: $!";
while (readdir $dh) {
  next if $_ =~ /^\.{1,2}$/;
  say "filepath: $dir/$_";
}
closedir $dh;