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. Несколько ссылок на скаляр
Если переменная
Значением объекта ссылки также может быть ссылка (косвенная ссылка) на другой объект, возможно, тоже на ссылку. Ссылка даже может содержать ссылку на саму себя! Таким образом при необходимости можно построить цепочку ссылок любой длины. Например:
$value = 'Полезное значение';
$ref1 = \$value; # ссылка на значение
$ref2 = \$ref1; # ссылка на ссылку на значение
$ref3 = \$ref2; # ссылка на ссылку на ссылку на значение
Можно организовать многоуровневые косвенные ссылки без использования промежуточных переменных, несколько раз применяя операцию взятия ссылки на значение. Например, создадим такую цепочку ссылок:
$ref_chain = \\\$value; # цепочка из трех ссылок
Для доступа по такой цепочке ссылок к исходному значению правило разыменования применяется нужное число раз. Например, в цепочке из трех ссылок с помощью трех префиксов $ мы последовательно получаем доступ к ссылочным переменным, а еще один префикс нужен для доступа к полезному значению:
# выведем исходное значение через $ref3:
print ${${${$ref3}}}; # или короче: print $$$$ref3;
# или через $ref_chain:
print $$$$ref_chain;
Если применить функцию
print ref($ref_chain); # выведет: 'REF'
print $ref_chain; # выведет, например: 'REF(0x334e8c)'
Подобным же образом можно работать со ссылками на массивы. Ссылка на переменную типа "массив" также создается с помощью операции взятия ссылки:
my @array = ('Это', 'список', 'в', 'массиве');
my $ref2array = \@array; # ссылка на массив
Если обращение к массиву будет происходить только по ссылке, то можно обойтись без переменной типа "массив", а создать анонимный массив и присвоить ссылку на него в скалярную переменную. Ссылка на анонимный массив создается с помощью квадратных скобок, в которые заключается список начальных значений безымянного массива:
my $ref2anon = [ # ссылка на анонимный массив
'Это', 'анонимный', 'массив'
]; # конец присваивания ссылки
my $ref2empty = []; # ссылка на пустой анонимный массив
Анонимные массивы удобно использовать для создания ссылки на копию массива. Для этого существующий массив помещается в квадратные скобки, и его значение будет скопировано в созданный анонимный массив:
my $ref2copy = [@array]; # ссылка на копию массива
Ссылка на именованный массив и ссылка на анонимный массив изображены на рис. 11.3.
Рис. 11.3. Ссылки на обычный и анонимный массивы
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии