4.7. Ссылки и операция разыменования
Глава 4 Операции и выражения
🕛 02.11.2006, 15:41
При выполнении программы Perl она, вместе с используемыми ею данными, размещается в оперативной памяти компьютера. Обращение к данным осуществляется с помощью символических имен - переменных, что является одним из преимуществ использования языка высокого уровня типа Perl. Однако иногда необходимо получить непосредственно адрес памяти, где размещены данные, на которые мы ссылаемся в программе с помощью переменной. Для этого в языке определено понятие ссылки, или указателя, который содержит адрес переменной, т. е. адрес области памяти, на которую ссылается переменная. Для получения адреса переменной используется операция ссылка, знак которой "\" ставится перед именем переменной:$т ='5;
$рт = \$т; f Ссылка на скалярную величину
Ссылки хранятся в скалярных переменных и могут указывать на скалярную величину, на массив, на хеш и на функцию:
@аггау = (1,2,3);
$раггау = \@аггау; # Ссылка на массив скаляров
%hesh = (опе=>1, two=>2, three=>3);
$phesh = \%hesh; § Ссылка на массив скаляров
Если распечатать в программе переменные-ссылки $pm, $parray и $phesh, то мы увидим строки, подобные следующим:
SCALAR(Ox655a74) ARRAY (Ох655ЫО) HASH(0x653514)
В них идентификатор определяет тип данных, а в скобках указан шестнадца-теричный адрес области памяти, содержащей данные соответствующего типа.
Для получения содержимого области памяти, на которую ссылается переменная-указатель, требуется выполнить операцию разыменования ссылки. Для этого достаточно перед именем такой переменной поставить символ, соответствующий типу данных, на который ссылается переменная ($, @, %):
@keys = keys(%$phash); # Массив ключей хеша @values = values(%$phash); # Массив значений хеша print "$$pm \n@$parray \n@keys \n@values";
Этот фрагмент кода для определенных в нем переменных-ссылок на скаляр, массив и хеш напечатает их значения:
5 # Значение скалярной переменной $т
123 # Значения элементов массива скаляров @аггау
three two one # Ключи хеша %hash
321 # Значения хеша %hash
Использование описанной выше простой операции разыменования может приводить к сложным, трудно читаемым синтаксическим конструкциям при попытке получить значения элементов сложных конструкций: массива массивов, массива хешей и т. п. Для подобных целей в языке Perl предусмотрена бинарная операция ->, левым операндом которой может быть ссылка на массив скаляров или хеш-массив, а правым операндом индекс элемента массива или хеша, значение которого необходимо получить: print "$parray->[0], .$parray->[1], .$parray->[2]\n"; print "$phash->{one}r $phash->{two}, $phash->{three}\n";
Эти операторы напечатают значения элементов массива ©array и хеша %hash. (Более подробно ссылки и операции разыменования рассматриваются в главе 9.)