我想运行一个perl脚本来只查找目录中的子目录。我不想拥有“。”和“..”返回。
我尝试使用的程序如下:
use warnings;
use strict;
my $root = "mydirectoryname";
opendir my $dh, $root
or die "$0: opendir: $!";
while (defined(my $name = readdir $dh)) {
next unless -d "$root/$name";
print "$name\n";
}
然而,这个输出有“。”和“......”。如何从列表中排除它们?
答案 0 :(得分:12)
如果你想将dirs收集到一个数组中:
my @dirs = grep {-d "$root/$_" && ! /^\.{1,2}$/} readdir($dh);
如果你真的只想打印dirs,你可以这样做:
print "$_\n" foreach grep {-d "$root/$_" && ! /^\.{1,2}$/} readdir($dh);
答案 1 :(得分:8)
next unless $name =~ /^\.\.?+$/;
此外,模块File :: Find :: Rule为这类事物提供了一个很好的界面。
use File::Find::Rule;
my @dirs = File::Find::Rule->new
->directory
->in($root)
->maxdepth(1)
->not(File::Find::Rule->new->name(qr/^\.\.?$/);
答案 2 :(得分:4)
只需修改您的支票,看看$ name是否等于'。'或'..'并跳过该条目。
答案 3 :(得分:1)
File::Slurp read_dir
自动排除特殊点目录(。和..)
为了你。你没有必要明确地摆脱它们。它还执行打开目录的检查:
use warnings;
use strict;
use File::Slurp qw(read_dir);
my $root = 'mydirectoryname';
for my $dir (grep { -d "$root/$_" } read_dir($root)) {
print "$dir\n";
}
答案 4 :(得分:0)
use warnings;
use strict;
my $root = "mydirectoryname";
opendir my $dh, $root
or die "$0: opendir: $!";
while (defined(my $name = readdir $dh)) {
next unless -d "$root/$name";
next if $file eq ".";
next if $file eq "..";
print "$name\n";
}