На этом шаге мы рассмотрим другие способы создания ссылок.
Перечислим другие способы создания ссылок, которые используются достаточно редко.
Ссылка на анонимную подпрограмму может быть создана при помощи ключевого слова sub, за которым следует блок - последовательность операторов, заключенная в фигурные скобки:
$sub_ref = sub {print "Привет!\n"};
В результате операции присваивания в переменную $sub_ref заносится адрес, по которому размещается код анонимной подпрограммы. В данном примере подпрограмма состоит из единственного обращения к функции print, выводящей строку "Привет!".
В версию 5.0 языка Perl была добавлена поддержка объектно-ориентированного программирования. Основой объектно-ориентированного подхода являются понятия "класс" и "объект".
Понятие "объект" реализовано в языке Perl таким образом, что объект становится доступным в программе только через ссылку на него. Для создания объекта используется специальная подпрограмма - конструктор, которая, в свою очередь, применяет для этого встроенную функцию bless(). Конструктор возвращает ссылку на объект. Таким образом, это еще один способ порождения ссылок, без которого не обойтись тем, кто использует объектно-ориентированный подход в Perl.
Компилятор Perl хранит имена всех переменных программы в таблице символов. Отдельная таблица символов существует для каждого пакета, образуя собственное пространство имен.
Каждый идентификатор, встречающийся в пакете, заносится в таблицу символов. Одинаковые идентификаторы, соответствующие переменным разных типов, образуют гнездо, в котором каждому типу соответствует свой элемент, содержащий адрес переменной данного типа. Если, например, в программе имеются следующие строки
$а=5; @а=(1,2,3,4,5); %a=("one"=>l, "two"=>2, "three"=>3); sub a {return "Hello, Mike!";};
то таблица символов содержит гнездо для идентификатора "а", состоящее из четырех элементов, хранящих адреса:
В языке Perl существует внутренний тип данных typeglob. Признаком этого типа является наличие префикса "*" в имени переменной. Тип typeglob служит для ссылки на все переменные разных типов с одинаковыми именами. Например, переменная *а обозначает ссылку на гнездо "а" в таблице символов. Используя специальную запись, можно при помощи переменной typeglob получить ссылки на отдельные элементы гнезда:
$scalarref = *a{SCALAR}; # Эквивалентно $scalarref = \$а; $arrayref = *a{ARRAY}; # Эквивалентно $arrayref = \@а; $hashref = *a{HASH}; # Эквивалентно $hashref = \%a; $coderef = *a{CODE}; # Эквивалентно $coderef = \&a; $globref = *a{GLOB}; # Эквивалентно $globref = \*a;
Со следующего шага мы начнем рассматривать разыменование ссылок.