Язык программирования Perl



              

Разыменование ссылок


Чтобы получить доступ к значению, на которое указывает ссылка, нужно выполнить разыменование ссылки (dereference). Для этого переменная, содержащая ссылку, заключается в фигурные скобки и перед ней ставится нужный разыменовывающий префикс: $ для скаляра, @ для массива, % для хэша, & для подпрограммы. (Другими словами, после разыменовывающего префикса, определяющего тип хранящегося в переменной значения, вместо имени переменной записывается содержащая ссылку переменная или выражение, возвращающее ссылку.) Если не возникает неоднозначности в интерпретации выражения, то переменную, хранящую ссылку, в фигурные скобки можно не заключать. Вот примеры разыменования ссылок на скалярные значения:

print "${$ref2scalar} "; # или: $$ref2scalar print "${$ref2literal} "; # или: $$ref2literal print "${$ref2expression} "; # или: $$ref2expression

Значение скалярной переменной при доступе по ссылке, естественно, может изменяться, но попытка с помощью ссылки изменить литерал вызовет ошибку при выполнении программы ("Modification of a read-only value attempted"):

${$ref2scalar} = 'Новый скаляр'; # вполне законно ${$ref2literal} = 'Новый литерал'; # ОШИБКА!!!

Когда на какое-то значение ссылается несколько ссылочных переменных, то обращаться к этому значению можно с помощью любой из них. Значение доступно до тех пор, пока на него имеется хотя бы одна ссылка. Например:

my $ref2scalar = \$scalar; # ссылка на скаляр my $one_more_ref = $ref2scalar; # копия ссылки на скаляр # будет выведено одно и то же значение $scalar: print "${$ref2scalar} ${$one_more_ref}";

На рис. 11.2 показана ситуация, когда несколько ссылок указывают на одну скалярную переменную.

Несколько ссылок на скаляр

Рис. 11.2.  Несколько ссылок на скаляр

Если переменная $ref2scalar перестанет ссылаться на $scalar (например, после undef $ref2scalar), то значение $scalar все еще будет доступно через переменную $one_more_ref.

Значением объекта ссылки также может быть ссылка (косвенная ссылка) на другой объект, возможно, тоже на ссылку. Ссылка даже может содержать ссылку на саму себя! Таким образом при необходимости можно построить цепочку ссылок любой длины. Например:

$value = 'Полезное значение'; $ref1 = \$value; # ссылка на значение $ref2 = \$ref1; # ссылка на ссылку на значение $ref3 = \$ref2; # ссылка на ссылку на ссылку на значение




Содержание  Назад  Вперед