Получение списка файлов по шаблону
Проблема
Требуется получить список файлов по шаблону, аналогичному конструкциям *.* (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
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|