На этом шаге мы рассмотрим получение значения по ссылке, представляющей скалярную переменную.
Разыменованием ссылки называется получение объекта, на который указывает эта ссылка. Для разыменования, как и для создания ссылки, применяются различные синтаксические конструкции. Вид конструкции зависит от типа ссылки, к которой применяется разыменование. Рассмотрим их по степени возрастания сложности.
Если ссылка на некоторый объект: скалярную переменную, массив, ассоциативный массив и т. д., является простой скалярной переменной без индексов, то для обращения к самому объекту применяется правило: вместо имени объекта подставить в выражение простую скалярную переменную, содержащую ссылку. Например:
$а = $$scal_ref; @b = @$arr_ref; %с = %$hash_ref; &f = &$code_ref; $$d[0] = 7; $$h{"one"} = 1;
Здесь предполагается, что переменная $scal_ref содержит ссылку на скалярную величину, $arr_ref - ссылку на массив, $hash_ref - ссылку на ассоциативный массив, $code_ref - ссылку на подпрограмму.
Рассмотрим подробно пятую строку.
Во-первых, следует определить, что является ссылкой: скалярная переменная $d, указывающая на анонимный массив, или элемент $d[0] массива @d. Ответ содержится в сформулированном выше правиле разыменования. Поскольку в строке 5 применяется именно оно, то индексированная переменная $d[0] ссылкой быть не может. Ссылкой является простая скалярная переменная $d, которая используется в качестве имени. Из контекста видно, что на ее месте должно стоять имя массива, следовательно, $d является ссылкой на анонимный массив.
Во-вторых, здесь мы имеем пример неявного создания ссылки. Ссылка $d не была ранее создана явным образом, но ее существование предполагается в операции присваивания. Поэтому компилятор создаст ссылку $d на анонимный массив, поместит в нее адрес массива и по этому адресу сохранит значение первого элемента, равное 7.
Все сказанное можно отнести к шестой строке с единственным отличием: вместо ссылки на анонимный массив здесь фигурирует ссылка $h на анонимный хеш-массив.
Таким образом, разименованые ссылки могут располагаться не только в правой, но и в левой части оператора присваивания, то есть доступ к объекту можно реализовать через разыменование ссылки на него.
На следующем шаге мы рассмотрим использование блоков в операциях разименования.