Глобы

Обычно командный процессор расширяет файловые спецификации в командной строке до имен конкретных файлов, совпадающих с ними. Эти спецификации называются глобами (glob). Например, если передать команде echo файловую спецификацию *.pm, командный процессор расширит ее до списка подходящих имен:

$ echo *.pm
barney.pm dino.pm fred.pm wilma.pm
$

Команде echo ничего не нужно знать о замене *.pm, потому что командный процессор уже выполнил ее. Глобы работают даже в программах Perl:

$ cat >show-args
foreach $arg (@ARGV) {
print "one arg is $arg\n";
}
^D
$ perl show-args *.pm
one arg is barney.pm
one arg is dino.pm
one arg is fred.pm
one arg is wilma.pm
$

Обратите внимание: show-args не нужно ничего знать о глобах – имена уже расширены и занесены в массив @ARGS. Но иногда в программах Perl появляются шаблоны типа *.pm. Можно ли расширить их до подходящих имен файлов без особых усилий? Конечно – достаточно воспользоваться оператором glob:

my @all_files = glob "*";
my @pm_files = glob "*.pm";

Здесь в @all_files заносятся все файлы текущего каталога, отсортированные по алфавиту и не начинающиеся с точки (по аналогии с командным процессором).


В массив @pm_files заносится тот же список, который был получен ранее с передачей шаблона *.pm в командной строке. Практически все шаблоны, выводимые в командной строке, также можно разместить в (единственном) аргументе glob, в том числе и список шаблонов, разделенных запятыми:

my @all_files_including_dot = glob ".* *";

Здесь мы передаем дополнительный параметр .* для получения имен всех файлов – как начинающихся с точки, так и обычных. Обратите внимание: пробел между этими двумя шаблонами в строке, заключенной в кавычки, важен, так как он разделяет два разных шаблона. Почему эта конструкция в точности повторяет функциональность командного процессора? Дело в том, что до выхода версии Perl 5.6 оператор glob просто вызывал /bin/csh2 для выполнения расширения. По этой причине глобы занимали много времени, а их обработка для больших каталогов (и в ряде других случаев) могла приводить к сбоям. Сознательные программисты Perl старались избегать глобов, отдавая предпочтение дескрипторам каталогов, которые мы рассмотрим позже в этой главе. Впрочем, если вы используете современную версию Perl, об этих проблемах можно забыть.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Альтернативный синтаксис глобов
Дескрипторы каталогов
Изменение временных меток
Изменение разрешений
Операции с файлами и каталогами

Вернуться в раздел: Perl / 12. Операции с каталогами