На этом шаге мы рассмотрим правила использования операции "->".
Применение правила разыменования предыдущего шага может привести к появлению громоздких выражений, содержащих множество вложенных друг в друга блоков, и очень сложных для визуального восприятия. Даже достаточно простые конструкции требуют определенного усилия для того, чтобы понять, что они означают:
${$а[0]}[1] = 17; ${$b[0]}{"оnе"} = 1;
В первой строке осуществляется обращение к отдельному элементу массива массивов, во второй - к отдельному элементу массива хеш-массивов.
Несколько упростить запись и улучшить наглядность можно, используя операцию "->" ("стрелка").
Аргумент слева от стрелки может быть любым выражением, возвращающим ссылку на массив или хеш-массив.
Если левосторонний аргумент является ссылкой на массив, то аргумент справа от стрелки - индекс, заключенный в квадратные скобки и определяющий элемент этого массива. Если левосторонний аргумент является ссылкой на хеш-массив, то аргумент справа от стрелки - значение ключа, помещенное в фигурные скобки и определяющее элемент этого хеш-массива.
Результатом операции "->" является соответственно значение элемента массива или хеш-массива. Предыдущий пример можно более компактно записать в виде:
$а[0]->[1] = 17; $b[0]->{"опе"} = 1;
Конструкция $а[0]->[1] обозначает второй элемент массива, определяемого ссылкой $а[0]. Конструкция $b[0]->{"оnе"} обозначает элемент, соответствующий ключу "one" хеш-массива, задаваемого ссылкой $b[0].
Вообще, если $arr_ref - ссылка на массив, то $arr_ref->[$i] обозначает i-й элемент этого массива. Если $hash_ref - ссылка на хеш-массив, то $hash_ref->{"key"} обозначает элемент этого хеш-массива, соответствующий ключу "key".
Если бы в последнем примере вместо именованных массивов @а и @b использовались ссылки на массив, например, $ref_a и $ref_b, то соответствующие операции присваивания имели вид:
$ref_a->[0]->[l] = 17; $ref_b->[0]->{"one"} = 1;
Здесь мы снова сталкиваемся с неявным созданием ссылок. По контексту элемент массива $ref_a->[0] должен быть ссылкой на массив, а $ref_b->[0] - ссылкой на хеш-массив. Обе ссылки ранее не были определены, но их существование предполагается в контексте выражения. Данные ссылки будут созданы автоматически.
Операция "->" позволяет для обращения к отдельному элементу составного массива или хеш-массива использовать более простые выражения, например:
$a[$i]->[$j]->[$k] вместо ${${$a[$i]} [$j] } [$k], $b[$i]->{"key"}->[$j] вместо ${${$b[0] } {"key"} } [$j].
Дальнейшее упрощение связано с тем, что при обращении к элементам сложных структур, представляющих собой комбинации вложенных массивов и хеш-массивов, можно опустить символы "->" между квадратными и/или фигурными скобками, содержащими индексы или ключи элементов. Предыдущие выражения примут еще более простой вид:
$a[$i][$j][$k] и $b[$i] {"key"} [$j]
На следующем шаге мы рассмотрим символические ссылки.