Создание ссылок

Существует несколько способов порождения ссылок. Рассмотрим их в порядке следования от часто употребляемых синтаксических конструкций к более редким,

Операция ссылки \

Операция \, примененная к единственному аргументу, создает ссылку на этот аргумент. В качестве последнего может выступать переменная любого типа или литерал. Примеры:
$а = \5;
$scal_ref = \$a:
$arr_ref  = \@myarray;
$hash_ref = \%myfunc;
$func_ref = \&myfunc;
В данном примере скалярной переменной $а присваивается значение ссылки на константу 5, то есть адрес ячейки памяти, в которой хранится число 5. Адрес самой переменной $а хранится в переменной $scal__ref. Переменные $arr_ref, $hash_ref, $func_ref хранят адреса областей памяти, являющиеся начальными точками размещения соответственно массива @myarray, хэш-массива %myhash и кода функции myfunc. К переменным, содержащим ссылки, можно применять все операции, допустимые для скалярных величин. Их можно присваивать другим переменным, складывать, умножать, делить, выводить на экран и т. д. За исключением присваивания, применение подобных операций к ссылкам, как правило, смысла не имеет. Например, вывод рассмотренных выше переменных
print "$scal_ref\n", "$arr_ref\n", "hash_ref\n", "$func_ref\n";
будет состоять из строк, подобных следующим:
SCALAR(0х9b8994) 
ARRAY(0x9b8a18) 
HASH(0x9b8a60) 
CODE(0x9b3d14)
Здесь каждая строка содержит слово, обозначающее тип ссылки и ее значение — адрес в виде шестнадцатеричного числа.
Операция, которую действительно имеет смысл применять к ссылкам, — это операция разыменования, то есть операция получения того значения, на которое указывает ссылка. Синтаксические конструкции, используемые для разыменования ссылок, мы рассмотрим после того, как обсудим способы создания ссылок.

Конструктор анонимного массива

В рассмотренном выше примере операция \ применялась или к литералам, или к переменным — субъектам, обладающим именами, Perl позволяет создавать субъекты, не имеющие имен, присваивать им значения, применять в выражениях, используя вместо имен ссылки на эти анонимные субъекты. В качестве анонимных субъектов могут выступать массивы, хэш-массивы, функции, скаляры. Для создания ссылки на анонимный массив применяется специальная конструкция, использующая квадратные скобки:
$arr_ref = [1,2,3];
В результате данной операции присваивания будет создан анонимный массив с элементами (1,2,3), а переменной $arr_ref будет присвоено значение ссылки на этот массив.
Компилятор различает случаи использования квадратных скобок для создания ссылки на анонимный массив и для обращения к отдельным элементам массива, как, например, в операции присваивания
$а = $myarray[2]
ПРИМЕЧАНИЕ Свободный синтаксис языка Perl допускает существование конструкций, смысл которых неочевиден. К рассматриваемой теме имеет отношение следующий пример. Формально выражение \($а, $b, $с) представляет собой анонимный массив из трех элементов ($а, $b, $с), к которому применяется операция ссылки \. Означает ли это, что значением выражения является ссылка на анонимный массив? Нет, это просто сокращенная запись массива, состоящего из трех элементов-ссылок (\$а, \$b, \$с), а для создания ссылки на анонимный массив существует единственный способ, рассмотренный выше.

Конструктор анонимного ассоциативного массива

По аналогии с массивами можно создавать ссылки на анонимные ассоциативные массивы, используя фигурные скобки. Операция присваивания
$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, выводящей строку "Привет!".
Пример, иллюстрирующий данный вид ссылки, будет рассмотрен далее в этой главе.
Неявное создание ссылок
В рассмотренных случаях осуществляется явное создание ссылки при помощи операции \ или специальных синтаксических конструкций. В них всегда явным образом определяется скалярная переменная, в которую и заносится значение ссылки. Ссылка может также создаваться неявно в случае, когда операция разыменования применяется к ссылке, ранее не созданной в программе явным образом, и в контексте выражения предполагается, что такая ссылка должна существовать. Возможно, последнее предложение звучит не совсем понятно. Его смысл станет ясным в следующем разделе.

Следующая страница Содержание главы


Реклама