mobrule, Axeman и Sinan ответили на ваш вопрос: вы создали структуру данных глубиной 3 слоя вместо 2.
Я удивлен, что никто не предложил использовать базовую библиотеку Data :: Dumper , чтобы помочь понять вопросы структуры данных.
use Data::Dumper;
my @a = [[1]];
print Dumper \@a;
Это печатает:
$ VAR1 = [
[
[
1
]
]
];
В вашей ошибке использовался ссылочный конструктор массива []
вместо использования круглых скобок (или ничего). @a = ([1]);
Итак, почему Perl имеет странный синтаксис []
и {}
для объявления ссылок на хеш и массивы?
Все сводится к тому, что Perl сглаживает списки. Это означает, что если вы скажете: @a = (@b, @c);
, что @a
назначено содержимое @b
, объединенное с содержимым @c
. Это то же самое, что и метод списка extend
в Python. Если вы хотите, чтобы у @a
было два элемента, вам нужно заставить их не расширяться. Вы делаете это, беря ссылку на каждый массив: @a = (\@b, \@c);
. Это похоже на метод списка append
в Python.
Если вы хотите создать анонимные вложенные структуры, вам нужно иметь возможность пометить их как хэши или массивы. Вот тут и появился синтаксис, о котором я упоминал выше.
Но что хорошего в выравнивании списков? Почему стоит использовать этот необычный синтаксис для создания ссылок на массивы и хеш, который отличается от синтаксиса, используемого для нормальной инициализации?
Уплощение списка означает, что вы можете легко собрать список параметров подпрограммы в переменной и затем передать их, не делая ничего хитрого: foo(@some_args, 5, @more_args);
. См. Применить в википедии для получения информации о том, как эта концепция работает на других языках. Вы можете делать все другие приятные вещи с помощью map
и других функций.