Разыменование ссылки на массив производится аналогично разыменованию ссылки на скалярную переменную, только с использованием префикса массива @:
# будет выведено одно и то же значение @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++) { # цикл по строкам
$ref2RxC->[$row] = []; # строка: вложенный массив
for (my $col = 0; $col < 5; $col++) { # по колонкам
$ref2RxC->[$row]->[$col] = ($row+1).'.'.($col+1);
}
}
Небольшие многомерные массивы удобно создавать, используя вложенные анонимные массивы. Это присваивание создаст такой же массив, что и в предыдущем примере:
$ref2RxC = [ # ссылка на двумерный анонимный массив
[1.1, 1.2, 1.3, 1.4, 1.5], # 1-я "строка"
[2.1, 2.2, 2.3, 2.4, 2.5], # 2-я "строка"
[3.1, 3.2, 3.3, 3.4, 3.5] # 3-я "строка"
]; # конец присваивания ссылки
На рис. 11.4 изображен получившийся в результате "массив массивов" (Аrray of Аrrays, AoA), представляющий собой многомерный массив.
Рис. 11.4. Организация многомерного 'массива массивов'
Для вывода значений многомерного массива обычно используется нужное число вложенных циклов