$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.Организация многомерного 'массива массивов'
Для вывода значений многомерного массива обычно используется нужное число вложенных циклов for или других циклических конструкций:
# цикл по строкам (элементам массива верхнего уровня)
for (my $row = 0; $row < @{$ref2RxC}; $row++) {
# цикл по столбцам (элементам вложенных массивов)
for (my $col = 0; $col < @{$ref2RxC->[$row]}; $col++) {
print "$ref2RxC->[$row][$col] ";
}
print "\n";
}
В результате выполнения этой программы построчно будет выведено значение всех элементов из массива массивов:
1.1 1.2 1.3 1.4 1.5
2.1 2.2 2.3 2.4 2.5
3.1 3.2 3.3 3.4 3.5
В любой массив можно поместить список ссылок на другие программные объекты, например, таким образом:
@reference_list = (\$scalar, \@array, \%hash);
Можно записать то же самое более простым способом, поставив операцию взятия ссылки перед списком объектов в круглых скобках:
@reference_list = \($scalar, @array, %hash);
Списки ссылок на объекты могут, например, передаваться в подпрограмму для изменения перечисленных в списке объектов. Передача аргументов в подпрограммы по ссылке и по значению будет рассмотрена в следующей лекции.
Если попытаться разыменовать ссылку на несуществующий объект, то он автоматически будет создан. В этом случае работает удивительный механизм, называемый автосозданием объекта ссылки (буквально: "автооживление" - autovivification). Например, во время обращения по ссылке к элементу массива автоматически создается массив из пяти элементов, ссылка на него присваивается в переменную $array_ref, а пятый элемент получает начальное значение:
$array_ref->[4] = '5-й элемент'; # присваивание значения
print ref($array_ref); # вызывает к жизни массив
print scalar(@{$array_ref}); # из 5 элементов!
print $$array_ref[4]; # печатаем значение
Подобным образом применяя автосоздание объектов, можно создать цепочку ссылок, указывающих на некоторое значение:
$$$$ref = 25; # при попытке присвоить значение
# создаются 2 ссылочных переменных и 1 скалярная
print "$ref $$ref $$$ref $$$$ref\n";
# выведет: REF(0x334dd8) REF(0x334e8c) SCALAR(0x334e98) 25
Все, что говорилось о ссылках на массивы, применимо к ссылкам на хэши. Ссылка на переменную типа "хэш" получается с помощью операции взятия ссылки:
my %hash = ('Хэш' => 'ассоциативный массив');
my $ref2hash = \%hash; # ссылка на весь хэш
print ref($ref2hash); # вернет: HASH
Ссылка на анонимный хэш создается с помощью фигурных скобок, в которых записываются начальные значения хэша:
my $ref2anon = { # ссылка на анонимный хэш
'language' => 'Perl',
'author' => 'Larry Wall',
'version' => 5.8
}; # конец присваивания ссылки
При помощи анонимного хэша удобно создавать копию существующего хэша, чтобы затем работать с ним через ссылку:
my $ref2copy = {%hash}; # ссылка на копию хэша
Разыменование ссылки на хэш записывается так же, как разыменование ссылки на массив, но с префиксом хэша %. При разыменовании ссылки на хэш переменную, содержащую ссылку, для наглядности можно обрамлять фигурными скобками:
# будет выведено одно и то же значение %hash:
print %{$ref2hash}, %$ref2hash;
При помощи ссылок с хэшами можно выполнять любые действия, обращая внимание на правильное разыменование ссылки:
%hash_copy = %{$ref2hash}; # копия хэша
@hash_slice= @{$ref2hash}{$key1, $key2}; # срез хэша (массив)
@hash_keys = keys %{$ref2hash}; # ключи хэша (массив)
Разыменование ссылки на элемент хэша также записывается уже знакомым нам способом, когда перед ссылочной переменной ставится префикс скаляра $, а после нее - ключ элемента хэша в фигурных скобках. Ссылочная переменная может заключаться в фигурные скобки: