Подтвердить что ты не робот

Как я могу перебирать файлы в каталоге в Perl?

Возможный дубликат:
Как я могу перечислить все файлы в каталоге с Perl?

Я хочу пропустить несколько сотен файлов, которые все содержатся в одном каталоге. Как я могу сделать это в Perl?

4b9b3361

Ответ 1

#!/usr/bin/perl -w

@files = <*>;
foreach $file (@files) {
  print $file . "\n";
}

Где

 @files = <*>;

может быть

 @files = </var/www/htdocs/*>;
 @files = </var/www/htdocs/*.html>;

и др.

Ответ 2

Enjoy.

opendir(DH, "directory");
my @files = readdir(DH);
closedir(DH);

foreach my $file (@files)
{
    # skip . and ..
    next if($file =~ /^\.$/);
    next if($file =~ /^\.\.$/);

    # $file is the file used on this iteration of the loop
}

Ответ 3

Вы можете использовать readdir или glob.

Или вы можете использовать модуль, например Path::Class:

Обычно children() не будет включать собственные и родительские записи. и.. (или их эквиваленты в системах, отличных от Unix), потому что это похоже на бизнес Im-my-own-grandpa. Если вы хотите, чтобы все записи в каталоге, включая эти специальные, передали истинное значение для всего параметра:

@c = $dir->children(); # Just the children
@c = $dir->children(all => 1); # All entries

Кроме того, существует параметр no_hidden, который исключает все обычные "скрытые" записи - в Unix это означает исключение всех записей, начинающихся с точки (.):

@c = $dir->children(no_hidden => 1); # Just normally-visible entries

Или, Path::Tiny:

@paths = path("/tmp")->children;
@paths = path("/tmp")->children( qr/\.txt$/ );

Возвращает список объектов Path::Tiny для всех файлов и каталогов в каталоге. Автоматически исключает "." и "..".

Если предоставляется необязательный аргумент qr//, он возвращает только объекты для дочерних имен, которые соответствуют данному регулярному выражению. Для сопоставления используется только базовое имя:

@paths = path("/tmp")->children( qr/^foo/ );
# matches children like the glob foo*

Получение списка записей каталога в массиве отнимает некоторую память (в отличие от получения одного имени файла за раз), но с несколькими сотнями файлов это вряд ли будет проблемой.

Path::Class переносится в операционные системы, отличные от * nix и Windows. С другой стороны, AFAIK, его экземпляры используют больше памяти, чем экземпляры Path::Tiny.

Если проблема с памятью, вам лучше использовать readdir в цикле while.