opendir(D, "/path/to/directory") || die "Can't open directory: $!\n";
while (my $f = readdir(D)) {
print "\$f = $f\n";
}
closedir(D);
РЕДАКТИРОВАТЬ: Ой, извините, пропустил часть "в массив":
my $d = shift;
opendir(D, "$d") || die "Can't open directory $d: $!\n";
my @list = readdir(D);
closedir(D);
foreach my $f (@list) {
print "\$f = $f\n";
}
РЕДАКТИРОВАТЬ2: Большинство других ответов действительны, но я хотел прокомментировать этот ответ специально, в котором предлагается это решение:
opendir(DIR, $somedir) || die "Can't open directory $somedir: $!";
@dots = grep { (!/^\./) && -f "$somedir/$_" } readdir(DIR);
closedir DIR;
Во-первых, чтобы документировать то, что он делает, так как автор не сделал: он передает возвращенный список из readdir () через grep () , который возвращает только те значения, которые файлы (в отличие от каталогов, устройств, именованных каналов и т. д.), которые не начинаются с точки (что вводит в заблуждение имя списка @dots
, но это из-за изменений, которые он сделал при копировании его из readdir ( ) документация). Поскольку он ограничивает содержимое каталога, который он возвращает, я не думаю, что это технически правильный ответ на этот вопрос, но он иллюстрирует общую идиому, используемую для фильтрации имен файлов в Perl , и я подумал, что это будет ценный документ. Другой пример, который часто видели:
@list = grep !/^\.\.?$/, readdir(D);
Этот фрагмент читает все содержимое из дескриптора каталога D , кроме '.' и '..', поскольку их очень редко желательно использовать в списке.