По аналогии с массивами можно создавать ссылки на анонимные ассоциативные массивы, используя
фигурные скобки. Операция присваивания
$hash_ref = {
'Оnе' => 1,
'Two' => 2,
'Three' => 3
};
создаст анонимный хэш-массив
('Onе' => 1, 'Two' => 2, 'Three' => 3)
и присвоит переменной $hash_ref значение ссылки на этот хэш-массив.
Фигурные скобки используются во многих конструкциях, например для обращения к индивидуальному
элементу хэш-массива
$a = $myhash{"first"}
или для выделения блока операторов. Обычно такие случаи легко различимы, и их нельзя спутать с
порождением ссылки на анонимный хэш-массив. Но иногда возникают неоднозначные ситуации, требующие
разрешения. Забегая вперед, приведем пример, связанный с определением функции пользователем.
Предположим, что необходимо определить функцию, которая создает анонимный хэш-массив и возвращает
ссылку на него. Возвращаемое значение можно задать при помощи встроенной функции
return. Если
конструкция return отсутствует, то в качестве возвращаемого значения по умолчанию принимается значение
последнего выражения, вычисленного внутри функции. Таким образом, синтаксически допустимо следующее
определение функции:
sub get_hash_ref { {@_} }
В данном примере внутренняя конструкция в фигурных скобках интерпретируется как блок. Для того
чтобы она интерпретировалась как ссылка на анонимный хэш-массив, необходимо использовать функцию
return или поставить перед внутренней конструкцией знак +:
sub get_hash_ref { return {@_} }
sub get_hash_ref {+ {@_} }
Другие способы
В предыдущих разделах рассмотрены основные способы создания ссылок:
- применение операции \ к объекту ссылки;
- специальные конструкции [ ] и { } , создающие в определенном контексте ссылку соответственно на
анонимный массив и анонимный ассоциативный массив.
Эти способы применяются наиболее часто в тех случаях, когда возникает необходимость в использовании
ссылок. Но существуют и другие источники появления ссылок, о которых следует упомянуть для полноты
изложения.
Конструктор анонимной подпрограммы
Мы уже использовали в примерах подпрограммы, не дожидаясь их систематического изучения. Поэтому
можем рассмотреть в этой главе такой вид ссылки, как ссылка на анонимную подпрограмму.
Ссылка на анонимную подпрограмму может быть создана при помощи ключевого слова sub, за которым
следует блок — последовательность операторов, заключенная в фигурные скобки:
$sub_ref = sub { print "Привет!\n"};
В результате операции присваивания в переменную $sub__ref заносится адрес, по которому размещается
код анонимной подпрограммы. В данном примере подпрограмма состоит из единственного обращения к функции
print, выводящей строку "Привет!".
Пример, иллюстрирующий данный вид ссылки, будет рассмотрен далее в этой главе.
Неявное создание ссылок
В рассмотренных случаях осуществляется явное создание ссылки при помощи операции \ или специальных
синтаксических конструкций. В них всегда явным образом определяется скалярная переменная, в которую
и заносится значение ссылки. Ссылка может также создаваться неявно в случае, когда операция
разыменования применяется к ссылке, ранее не созданной в программе явным образом, и в контексте
выражения предполагается, что такая ссылка должна существовать. Возможно, последнее предложение
звучит не совсем понятно. Его смысл станет ясным в следующем разделе.