Шаг 60.
Операция разыменования "->"

    На этом шаге мы рассмотрим правила использования операции "->".

    Применение правила разыменования предыдущего шага может привести к появлению громоздких выражений, содержащих множество вложенных друг в друга блоков, и очень сложных для визуального восприятия. Даже достаточно простые конструкции требуют определенного усилия для того, чтобы понять, что они означают:

    ${$а[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]
соответственно.

    На следующем шаге мы рассмотрим символические ссылки.




Предыдущий шаг Содержание Следующий шаг