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

Говоря о глобах, мы имеем в виду оператор 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 = <FRED/*>; ## Глоб
my @lines = <FRED>; ## Чтение из файлового дескриптора
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 используется редко, опосредованное чтение тоже относительно нетипично и выполняется обычно с простой скалярной переменной.
Теги:
файл
Добавлено: 20 Июля 2018 21:06:58 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...