Perl pu sh элемент в массиве, который находится внутри другого массива - PullRequest
2 голосов
/ 26 февраля 2020

У меня есть массив (давайте назовем его X), а X содержит массивы. Я хочу поместить sh элемент (строку) в массив, который находится внутри X. Я пытался искать в течение довольно долгого времени, и все, что я нахожу, это люди, пытающиеся собрать sh массивы внутри других массивов.

Я пробовал следующий код:

push(@X[0],$element);

, который дает мне ошибку:

Экспериментальная пу sh на скаляре теперь запрещено в строке 30 perlscript.pl, рядом с "$ element)"

Я нахожусь на perl 5 версии 26.

Ответы [ 4 ]

5 голосов
/ 26 февраля 2020

В 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 .

3 голосов
/ 26 февраля 2020

Синтаксис для push:

push ARRAY, LIST

Например,

push @a, $element;

Когда появляется имя переменной, вы можете заменить имя блоком, который оценивается как ссылка .

push @{ $X[0] }, $element;

И это то, что вам нужно.

2 голосов
/ 26 февраля 2020

Я думаю, что это делает то, что вы хотите:

push @{ $X[0] }, $element;
1 голос
/ 27 февраля 2020

Как и все уже упоминавшиеся, push @{ $X[0] }, $element;.

Поскольку вы говорите, что используете v5.26, вы также можете использовать разыменование постфикса:

push $X[0]->@*, $element;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...