Perl,如何选择目录

Perl, how to choose a directory

我试图确定文件夹中的哪些内容是目录,哪些是文件,我写了以下内容但结果不是我所期望的:

opendir DH, $dir or die "Cannot open Dir: $!";
my @dirs = grep !/^\.\.?$/, readdir DH ;
foreach my $files (@dirs) {
    print $files."<br>";
    if ( -d $files ) 
    {
        print $files." is a directory<br>";
    }
}
closedir DH;

结果如下图所示:

.file1
file.log
file3.zip
file4
file5.zip
dir1.name1.suffix1.yyyy.MM.dd.hh.mm.ss
file5.zip
file6.tar
dir2
dir3.name1.suffix1.yyyy.MM.dd.hh.mm.ss

以 dir 开头的项目是实际目录,所以我的问题是为什么 if 无法发现它们? 我做错了什么?

$dir丢失...

if ( -d "$dir/$files" )
    {
        print $files." is a directory<br>";
    }

chdir$dir 最简单,这样您就不必在节点名称前加上路径前缀。如果您是 运行 Perl v5.10.1 或更高版本,您也可以 use autodie。最后,如果您使用 $_ 作为循环控制变量(file/directory 名称),您可以从 print-d 和正则表达式匹配 [=24= 的参数中省略它]

像这样

use strict;
use warnings;
use v5.10.1;
use autodie;

my ($dir) = @ARGV;

opendir my $dh, $dir;
chdir $dh;

while ( readdir $dh ) {
    next if /\A\.\.?\z/;
    print;
    print " is a directory" if -d;
    print "<br/>\n";
}

... # local expires. working directory returns to its original value

更新

鉴于ikegami's (deleted) comment about returning back to the original working directory, here's an example of using the File::chdir模块做的很整齐。它导出一个绑定变量 $CWD ,如果您分配给它,它将更改您的工作目录。您还可以对其进行本地化,因此只需将上面的代码用大括号括起来并为 $CWD 添加一个新的本地值即可保持整洁。请注意,File::chdir 不是核心模块,因此您可能需要安装它

注意 然而,仍然有很小的可能性,该进程可能会使用它无法 chdir 到的当前工作目录启动。这个模块不会解决那个问题

use strict;
use warnings;
use v5.10.1;
use autodie;

use File::chdir;

my ($dir) = @ARGV;

{
    opendir my $dh, $dir;
    local $CWD = $dir;

    while ( readdir $dh ) {
        next if /\A\.\.?\z/;
        print;
        print " is a directory" if -d;
        print "<br/>\n";
    }
}