# выведем исходное значение через $ref3:
print ${${${$ref3}}}; # или короче: print $$$$ref3;
# или через $ref_chain:
print $$$$ref_chain;
Если применить функцию ref() к переменной, содержащей ссылку на другой объект, то она вернет строку 'REF'. Если преобразовать в строку значение ссылки на ссылку, то будут выведено обозначение ссылочного типа и адрес объекта ссылки, например:
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.Ссылки на обычный и анонимный массивы
Разыменование ссылки на массив производится аналогично разыменованию ссылки на скалярную переменную, только с использованием префикса массива @:
# будет выведено одно и то же значение @array:
print "@{$ref2array} @$ref2array\n";
Естественно, что, обращаясь к массиву по ссылке, можно выполнять с ним любые действия, как и с именованным массивом, например:
my @array_copy = @{$ref2array}; # копия массива
@{$ref2array}[0,1] = ('Новый', 'список'); # срез массива
Разыменование ссылки на элемент массива оформляется так: перед ссылочной переменной, которая может заключаться в фигурные скобки, указывается префикс скалярного значения $, а после ссылочной переменной указывается индекс элемента в квадратных скобках. Другими словами, для обращения к элементу массива по ссылке имя массива заменяется ссылочной переменной:
print ${$ref2array}[0]; # или: $$ref2array[0]
Обращение по ссылке к элементу массива более наглядно записывается с помощью инфиксной операции ->, слева от которой записывается имя переменной, содержащей ссылку на массив, а справа - индекс элемента массива в квадратных скобках. Операция "стрелка" наглядно представляет ссылку, символы -> в ней записываются без пробела между ними. Вот пример:
# доступ по ссылке к значению элемента массива:
my $element_value = $ref2array->[0];
# изменение значения элемента массива:
$ref2array->[0] = $new_value;
Как к обычным скалярным значениям можно обращаться по ссылке к отдельным элементам массива, например:
$ref2element = \$array[0]; # ссылка на элемент массива
${$ref2element} = $new_value; # изменение элемента массива
В элементах массива можно хранить ссылки на другие массивы: это позволяет создавать в Perl многомерные массивы или "массивы массивов", как это делается в языке Java. В этом случае доступ к элементам многомерного массива также обычно записывается с использованием операции "стрелка", которая употребляется нужное количество раз:
@{$ref2NxM->[$n]} # вложенный массив
$ref2NxM->[$n]->[$m] # скалярный элемент двумерного массива
$ref2NxMxP->[$n]->[$m]->[$p] # элемент 3-мерного массива
Для удобства чтения программы допускается не записывать операцию "стрелка" между парами индексов массива в квадратных скобках:
$ref2NxM->[$n][$m] # так гораздо симпатичнее!
$ref2NxMxP->[$n][$m][$p] # а тем более так...
Для примера приведем программу создания двумерного массива из трех строк по пять элементов в каждой строке:
my $ref2RxC = []; # ссылка на анонимный массив массивов
for (my $row = 0; $row < 3; $row++) { # цикл по строкам