Три очка
- $ myarray содержит ссылку на массив, а не на массив.
- $ mayarray и @myarray - это разные переменные
- Perl на самом деле не делает многомерных массивов
Все ссылки хранятся в скалярах, поэтому все ссылки хранятся в переменных, которые начинаются с $
.
[ ... ]
создает анонимную ссылку на массив, поэтому [ [1, 2, 3], [4, 5, 6], [7, 8, 9]]
создает анонимную ссылку на массив, содержащий 3 анонимные ссылки на массив, каждая из которых содержит 3 скаляра.
Это означает, что присвоение $ myarray присваивает ему ссылку на внешний анонимный массив.
Чтобы получить доступ к тому, на что указывает ссылка два, нужно разыменовать его. Вы можете сделать это, поместив символ для типа того, на что указывает ссылка, перед ссылкой, такой как @$myarray
. Таким образом, $$myarray[0]
является первым элементом анонимного массива, содержащегося в ссылке $myarray
, или вы можете использовать косвенный синтаксис $myarray->[0]
.
В вашем примере $myarray->[0]
содержит ссылку на массив [1,2,3]
Так что на него можно ссылаться таким же образом, давая $myarray->[0]->[0]
Это говорит о разыменовании $myarray
и дает мне первый элемент, который является ссылкой на массив, затем разыщите это и дайте мне первый элемент этого.
Это ваш второй пример.
Perl позволяет отбрасывать ->
между ]
и [
, а также }
и {
для анонимных хэшей как синтаксический сахар. Это дает $myarray->[0][0]
, который является вашим первым примером.
Ваш третий пример ищет первый элемент @myarray
, который отличается от $myarray
. если бы вы поместили use strict
в начало вашего скрипта, Perl поймал бы эту ошибку для вас.
Хорошая идея поставить
use strict;
use warnings;
Как первые две строки любого скрипта или модуля Perl, поскольку они будут отлавливать множество плохих и потенциально фатальных ошибок в вашей Программе. Если вы отлаживаете программу, то добавление use diagnostics
в use strict
дает больше подробных сообщений.