ОК, я просто должен представить свой ответ
sub has_subfolder {
my $dir = shift;
my $found = 0;
opendir my $dh, $dir or die "Could not open directory $dir: $!";
while (my $_ = readdir($dh)) {
next if (/^\.\.?$/); # skip '.' and '..'
my $path = $dir . '/' . $_; # readdir doesn't return the whole path
if (-d $path) { # found a dir? record it, and leave the loop!
$found = 1;
last;
}
closedir($dh); # make sure we cleanup after!
return $found;
}
По сравнению с другими ответами:
- находит скрытые каталоги
- завершается, как только находит совпадение
- не пересекает дерево дважды (один раз для обычных файлов и снова для скрытых файлов)
РЕДАКТИРОВАТЬ - Я вижу, что требования только что изменились (вздох). К счастью, приведенный выше код тривиально изменен:
sub get_folders {
my $dir = shift;
my @found;
opendir my $dh, $dir or die "Could not open directory $dir: $!";
while (my $_ = readdir($dh)) {
next if (/^\.\.?$/); # skip '.' and '..'
my $path = $dir . '/' . $_; # readdir doesn't return the whole path
push(@found, $_) if (-d $path) # found a dir? record it
}
closedir($dh); # make sure we cleanup after!
return @found;
}