Альтернативный синтаксис глобов

Говоря о глобах, мы имеем в виду оператор glob, однако ключевое слово glob не так уж часто встречается в программах, использующих глобы. Почему? Большая часть старого кода была написана до того, как оператор glob получил свое имя. Вместо этого он использовался в синтаксисе с угловыми скобками, напоминающем синтаксис чтения из файлового дескриптора:

my @all_files = <*>; ## Полностью эквивалентно my @all_files = glob "*";

Значение в угловых скобках интерполируется по аналогии со строками в кавычках; это означает, что переменные Perl перед обработкой глоба заменяются своими текущими значениями:

my $dir = "/etc";
my @dir_files = <$dir/* $dir/.*>;

Этот фрагмент получает список всех файлов (с точкой и без) из заданного каталога, так как переменная $dir заменяется своим текущим значением. Итак, если угловыми скобками обозначается как чтение из файлового дескриптора, так и операции с глобами, как же Perl определяет, какой из двух операторов должен использоваться в каждом конкретном случае? По содержимому угловых скобок. Файловый дескриптор должен быть идентификатором Perl. Таким образом, если содержимое угловых скобок является идентификатором Perl, имеется в виду операция чтения; в противном случае используется операция с глобами.


Пример:

my @files = ; ## Глоб
my @lines = ; ## Чтение из файлового дескриптора
my $name = "FRED";
my @files = <$name/*>; ## Глоб

У этого правила существует единственное исключение: если в угловых скобках находится простая скалярная переменная (не элемент хеша или массива) с именем файлового дескриптора, то конструкция интерпретируется как опосредованное чтение из файлового дескриптора:

my $name = "FRED";
my @lines = <$name>; ## Опосредованное чтение из дескриптора FRED

Выбор между операцией с глобом и файловым дескриптором осуществляется во время компиляции, и поэтому он не зависит от содержимого переменной. При желании функциональность опосредованного чтения из файловых дескрипторов можно представить оператором readline2; такая запись более понятна:

my $name = "FRED";
my @lines = readline FRED; ## Чтение из FRED
my @lines = readline $name; ## Чтение из FRED

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

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

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

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