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

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

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

27
задан Community 23 May 2017 в 11:55
поделиться

3 ответа

asyncore отстой. glib уже предоставляет асинхронный материал, поэтому просто используйте основной контур glib , чтобы сделать все.

-121--4349501-

Я думаю, что обычно предполагается (даже пуристами TDD), что программист, разрабатывающий приложение путем написания тестов, уже знает что-то о дизайне и архитектуре. Иначе можно просто вписать себя в хаос программирования и анархию, написав тесты на отказ от любых принципов проектирования.

Следовательно, разработчик, пишущий приложение «сначала проверяет», уже имеет справедливое представление о том, как будет выглядеть его окончательная структура класса, и это видение направляет его, когда он пишет свои тесты.

-121--3107621-

Наслаждайтесь.

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
}
19
ответ дан 28 November 2019 в 04:21
поделиться

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

Или, вы можете использовать модуль, такой как путь PATH :: класс :

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

 @C = $ Dir-> дети ();  # Только дети
 @C = $ Dir-> дети (все => 1);  # Все записи
 

Кроме того, есть параметр no_hidden, который исключает все нормально «скрытые» записи - на Unix это означает, что исключает все записи, которые начинаются с точки (. ):

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

или Путь :: Tiny :

 @Paths = Path («/ TMP») -> Дети;
 @Paths = Path («/ TMP») -> Дети (QR / \. TXT $ /);
 

Возвращает список Путь :: Tiny объекты для всех файлов и каталогов в каталоге. Изучает »." и ".." автоматически.

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

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

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

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

Если воспоминание - это проблема, вам лучше использовать READDIR в , в то время как POLOOP.

13
ответ дан 28 November 2019 в 04:21
поделиться
#!/usr/bin/perl -w

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

где

 @files = <*>;

может быть

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

и т. Д.

48
ответ дан 28 November 2019 в 04:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: