В Perl массивы не могут содержать другие массивы. Чтобы создать многомерную структуру данных, вам нужны ссылки.
Рассмотрите этот пример.
use strict; use warnings;
use Data::Dumper;
my @inner = qw(a b c);
my @outer = (
\@inner, # reference to existing array
[100, 200, 300], # new anonymous array reference
);
print Dumper \@outer;
Это печатает
$VAR1 = [
[
'a',
'b',
'c'
],
[
100,
200,
300
]
];
Ваш внешний массив как раз такой, массив. Но элементы внутри него являются ссылками на массивы. Вы можете ссылаться на существующий массив или создавать новый анонимный.
При выгрузке структуры для отладки обратите внимание, что Dumper
из Data :: Dumper также требует ссылки , поэтому мы используем ту же запись с \
.
Теперь, чтобы добавить элемент к @inner
через его положение внутри @outer
, вам нужно вынуть первый элемент из @outer
. Для этого сигил меняется, поэтому вы получаете $outer[0]
. Чтобы передать это push
, нам нужно превратить его в массив. Это называется разыменованием как массива.
push @{ $outer[0] }, 'd';
Когда мы снова Dumper
это получим, мы получим
$VAR1 = [
[
'a',
'b',
'c',
'd'
],
[
100,
200,
300
]
];
Поскольку первый элемент является ссылкой на именованная переменная массива, мы также можем работать с ней напрямую.
push @inner, 'e';
Это изменит значение первого элемента в @outer
, потому что оба ссылаются (посмотрите, почему он называется reference ?) к тому же в памяти.
$VAR1 = [
[
'a',
'b',
'c',
'd',
'e'
],
[
100,
200,
300
]
];
Мы не можем сделать это со вторым элементом, потому что он начинался как анонимная ссылка.
Давайте иметь посмотрите на ваше предупреждение.
Экспериментальное pu sh на скаляре теперь запрещено в perlscript.pl строка 30, рядом с "$ element)"
In Perl 5.20.0 push
для ссылок устарел , поскольку он не работал должным образом и начал предупреждение. В Perl 5.30.0 это было изменено и теперь является фатальной ошибкой , что делает вашу программу d ie.
Также см. perlref и perlreftut .