Ссылки и операция разыменования

Каждая переменная Perl (скалярная, массив скаляров или хэш-массив), как мы знаем, является символическим именем, с помощью которого нам, по существу, предоставляется возможность обращаться к некоторой области памяти, выделенной для хранения значений соответствующей переменной. Такой способ обращения к содержимому памяти является одним из преимуществ языков высокого уровня по сравнению с языками низкого уровня, в которых выделение и обращение к областям памяти осуществляется непосредственно по их адресам.
Однако иногда и в программе, написанной на языке высокого уровня, необходимо получить адрес памяти, где размещены данные, на которые мы ссылаемся с помощью переменной. В языке Perl определено понятие ссылки, или указателя, которое соответствует адресу памяти «расположения» переменной. Чтобы получить в программе адрес области памяти, выделенной для некоторой переменной, следует использовать операцию получения ссылки, знак которой (\) ставится перед именем переменной. Результатом ее выполнения является ссылка, указывающая на область памяти расположения соответствующей переменной:
$scalar = 5.9:
$pscalar = \$scalar;   # Ссылка на скалярную величину
@аrrау = (s1, s2, s3);
$parray = \@аrrау:     # Ссылка на массив скаляров
%hash = (name=>Alex, surname=>Born);
$phash = \%hash;       # Ссылка на хэш-массив
Ссылки хранятся в скалярных переменных и могут указывать на любой примитивный тип данных языка Perl: скаляр, массив или хэш-массив. Если в программе распечатать содержимое определенных выше переменных-ссылок $pscalar, $parray и $phash, то мы увидим строки, подобные следующим:
SCALAR(Qxl762bOO)
ARRAY(0x1762B78)
HASH(0x1762914)
В них идентификатор определяет тип данных, а в скобках указан шестнадцатеричный начальный адрес расположения в памяти компьютера.
Если у нас имеется переменная, хранящая ссылку на некоторые данные определенного типа, то для получения их значения следует выполнить операцию разыменования ссылки. Для этого достаточно перед именем переменной-ссылки поставить символ, соответствующий типу данных, на который она ссылается. Например, чтобы распечатать содержимое областей памяти, на которые ссылаются определенные выше переменные-ссылки, можно выполнить следующие операторы:
print "$$pscalar\n"; # Разыменование ссылки на скаляр 
print "@$parray\n";  # Разыменование ссылки на массив 
@temp = %$phash;     # Разыменование ссылки на хэш print "@temp\n";
ВНИМАНИЕ Обратите внимание на то, как было распечатано содержимое хэш-массива. Сначала мы сохранили все пары ключ/значение в массиве скаляров, а потом использовали возможность его подстановки в строку, так как для хэш-массивов эта операция не определена.
В Perl операции получения ссылок и их разыменования используются для создания сложных структур данных: массива массивов, массива хэш-массивов, хэш-массивов массивов и т. п. Однако использование в подобных конструкциях операции разыменования может приводить к сложным, трудно читаемым синтаксическим конструкциям при необходимости получения значений сложных структур данных.
Чтобы облегчить восприятие разыменования ссылок на массивы и хэш-массивы, в языке предусмотрена бинарная операция «стрелка» (->), которая также выполняет разыменование указанных ссылок. Ее левым операндом может быть ссылка на массив или хэш-массив, тогда как правый операнд должен представлять индекс элемента массива (в случае массива скаляров — целое число в квадратных скобках [...], в случае хэш-массива — ключ в фигурных скобках {...}), значение которого необходимо получить. С использованием этой операции распечатать значения элементов массивов @аrrау и %hash теперь можно и так:
print "$parray->[0], $рarrау->[1], $parray->[2]\n"; 
print "$phash->{name}, $phash->{surname}\n";

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


Реклама