Получение списка подкаталогов (только верхнего уровня) в каталоге с использованием Perl - PullRequest
9 голосов
/ 22 апреля 2011

Я хотел бы запустить 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";
}

Вывод этого, однако, имеет "." а также "..". Как я могу исключить их из списка?

Ответы [ 4 ]

12 голосов
/ 22 апреля 2011

Если вы хотите собрать каталоги в массив:

my @dirs = grep {-d "$root/$_" && ! /^\.{1,2}$/} readdir($dh);

Если вы действительно хотите распечатать каталоги, вы можете сделать:

print "$_\n" foreach grep {-d "$root/$_" && ! /^\.{1,2}$/} readdir($dh);
8 голосов
/ 22 апреля 2011
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/^\.\.?$/);
4 голосов
/ 22 апреля 2011

Просто измените ваш чек, чтобы увидеть, когда $ name равно '.' или «..» и пропустите запись.

1 голос
/ 22 апреля 2011

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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...