Получение списка файлов по шаблону

Проблема

Требуется получить список файлов по шаблону, аналогичному конструкциям *.* (MS-DOS) и *.h (UNIX).

Решение

Семантика командного интерпретатора С shell системы UNIX поддерживается в Perl с помощью ключевого слова glob и оператора <>:
@list = <*.c>;
@list = glob("*.c");
Для ручного извлечения имен файлов можно воспользоваться функцией readdir:
opendir(DIR, $path);
@files = grep { /\.c$/ } readdir(DIR);
closedir(DIR);
Модуль File::KGlob от CPAN получает список файлов без ограничений длины:
use File::KGlob;
@files = glob("*.c");

Комментарий

Встроенная функция Perl glob и запись <ШАБЛОН> (не путать с записью <МАНИПУЛЯТОР>) в настоящее время на большинстве платформ используют внешнюю программу для получения списка файлов. В UNIX это программа csh а в Windows — dosglob.exe. На Macintosh и в VMS это реализуется на внутреннем уровне, без внешних программ. Предполагается, что шаблоны обеспечивают семантику С shell во всех системах, отличных от UNIX, и улучшают переносимость. Из-за использования интерпретатора в UNIX такое решение не подходит для сценариев с атрибутом setuid.
Чтобы справиться с затруднениями, можно реализовать собственный механизм отбора с применением встроенного оператора opendir или модуля File::KGlob от CPAN — в обоих случаях внешние программы не используются. File::KGlob обеспечивает семантику отбора по типу интерпретаторов UNIX, тогда как opendir позволяет отбирать файлы с помощью регулярных выражений Perl. В простейшем решении с opendir список, возвращаемый readdir, фильтруется с помощью grep:
@files = grep { /\.[ch]$/i } readdir(DH);
То же самое можно сделать и с помощью модуля DirHandle:
use DirHandle;
$dh = DirHandle->new($path) or die "Can't open $path : $!\n";
@files = grep { /\.[ch]$/i } $dh->read();
Как обычно, возвращаемые имена файлов не содержат каталога. При использовании имени каталог приходится присоединять вручную:
opendir(DH, $dir) or die "Couldn't open $dir for reading: $!";
@files = ();
while( defined ($file = readdir(DH)) ) {
  next unless /\.[ch]$/i;
  my $filename = "$dir/$file";
  push(@files, $filename) if -T $file;
}

См. также

Описание функций closedir, opendir, readdir, rewinddir, seekdir и telldir



2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: