Возможный дубликат:
Как я могу перечислить все файлы в каталоге с Perl?
Я хочу пропустить несколько сотен файлов, которые все содержатся в одном каталоге. Как я могу сделать это в Perl?
Возможный дубликат:
Как я могу перечислить все файлы в каталоге с Perl?
Я хочу пропустить несколько сотен файлов, которые все содержатся в одном каталоге. Как я могу сделать это в Perl?
#!/usr/bin/perl -w
@files = <*>;
foreach $file (@files) {
print $file . "\n";
}
Где
@files = <*>;
может быть
@files = </var/www/htdocs/*>;
@files = </var/www/htdocs/*.html>;
и др.
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
}
Вы можете использовать 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
.