Perl,如何选择目录

时间:2015-07-23 12:09:22

标签: perl if-statement directory

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

[navigationController pushViewController:ViewController animated:YES];

结果如下例所示:

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;

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

2 个答案:

答案 0 :(得分:4)

$dir遗失......

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

答案 1 :(得分:1)

chdir$dir最简单,因此您不必在节点名称前加上路径。如果您运行的是Perl v5.10.1或更高版本,也可以use autodie。最后,如果使用$_作为循环控制变量(文件/目录名称),可以从print-d和正则表达式匹配

的参数中省略它

喜欢这个

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(删除)评论,这里是使用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";
    }
}