Можно записать то же самое более простым способом, поставив операцию взятия ссылки перед списком объектов в круглых скобках:
@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}; # ключи хэша (массив)
Разыменование ссылки на элемент хэша также записывается уже знакомым нам способом, когда перед ссылочной переменной ставится префикс скаляра $, а после нее - ключ элемента хэша в фигурных скобках. Ссылочная переменная может заключаться в фигурные скобки:
${$ref2hash}{'ключ'} = 'значение'; # изменение значения
print $$ref2hash{'ключ'}; # доступ к значению элемента хэша
В другой форме разыменования ссылки к переменной, содержащей ссылку на хэш, применяется операция "стрелка", после которой в фигурных скобках указывается ключ элемента хэша. Вот так:
$ref2hash->{'термин'} = 'определение'; # добавим элемент
$value = $ref2hash->{'Хэш'}; # найдем значение по ключу
Если ссылка используется как ключ хэша, она, как и любой ключ хэша, автоматически преобразуется в строку. Такие строки невозможно применять для доступа к объектам ссылки, но они могут служить отличными уникальными ключами хэша, поскольку строковое значение ссылки содержит адрес объекта в памяти, например, 'SCALAR(0x335b04)' или 'ARRAY(0x334dd8)'. Если все-таки требуется использовать ссылки в качестве ключей хэша, то можно воспользоваться модулем Tie::RefHash.
Аналогично созданию "массива массивов" создаются и другие разновидности ссылочных структур данных: массивы хэшей, хэши массивов и хэши хэшей. Ссылочные структуры применяются для структурированного представления взаимосвязанных данных. Для хранения в каждом элементе массива нескольких значений применяется массив хэшей (Array of Hashes, AoH). Вот пример массива, содержащий ссылки на анонимные хэши, в каждом из которых хранятся сведения о каком-либо объекте:
my $AoH = [ # этапы "Формулы-1" '2006 года
{grandprix=>'Бахрейна', date=>'2006.03.12'},
{grandprix=>'Малайзии', date=>'2006.03.19'},
{grandprix=>'Австралии', date=>'2006.04.02'},
{grandprix=>'Сан-Марино', date=>'2006.04.23'},
# и так далее...
];
# напечатать хэш, на который ссылается 4-й элемент массива
print "Гран-при $AoH->[3]->{grandprix} $AoH->[3]->{date}";
# выведет: Гран-при Сан-Марино 2006.04.23
Для того чтобы ассоциировать с каждым ключом хэша список скалярных значений, применяется хэш массивов (Нash of Аrrays, HoA). Приведем пример хэша массивов, где в каждом элементе хэша хранится ссылка на анонимный список ассоциированных значений:
my $HoA = { # годы создания языков программирования
1964 => ['SIMULA', 'BASIC', 'PL/1'],
1970 => ['Forth', 'Pascal', 'Prolog'],
1979 => ['Ada', 'Modula-2'],