# цикл по строкам (элементам массива верхнего уровня)
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}; # ключи хэша (массив)
Разыменование ссылки на элемент хэша также записывается уже знакомым нам способом, когда перед ссылочной переменной ставится префикс скаляра $, а после нее - ключ элемента хэша в фигурных скобках. Ссылочная переменная может заключаться в фигурные скобки: