Альтернативный синтаксис глобовГоворя о глобах, мы имеем в виду оператор 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 используется редко, опосредованное чтение тоже относительно нетипично и выполняется обычно с простой скалярной переменной. Статьи из раздела Perl на эту тему: ![]() ![]() ![]() ![]() ![]() Вернуться в раздел: Perl / 12. Операции с каталогами
|