Добавление элемента в несколько массивов с помощью одной команды в Perl - PullRequest
0 голосов
/ 05 апреля 2019

Могу ли я добавить элемент в более чем 1 массив, используя push in perl?

Например

my @arr1 = qw/one two three/;
my @arr2 = qw/four five six/;
push (@arr1,@arr2), "extra";

Ожидаемый результат ::

@arr1 = one two three extra
@arr2 = four five six extra

1 Ответ

2 голосов
/ 05 апреля 2019

Документация для push() довольно ясна.

push ARRAY, LIST

Рассматривает ARRAY как стекдобавление значений LIST к концу ARRAY.Длина ARRAY увеличивается на длину LIST.Имеет тот же эффект, что и

for my $value (LIST) {
    $ARRAY[++$#ARRAY] = $value;
}

, но более эффективен.Возвращает количество элементов в массиве после завершенного нажатия.

Начиная с Perl 5.14, экспериментальная функция позволила push принять скалярное выражение.Этот эксперимент был признан неудачным и был удален с Perl 5.24.

Итак, нет.push() работает только с одним массивом одновременно.

Ваше решение:

push (@arr1,@arr2), "extra";

Будет иметь эффект добавления всех элементов @arr2 в конец @arr1.«Extra» будет игнорироваться, так как закрывающая скобка будет рассматриваться как конец списка параметров до push()use warnings вы получите предупреждение:

Бесполезное использование константы («extra») в пустом контексте

Это можно сделать с помощью двух вызововдо push() и скрывая сложность в подпрограмме.Наивное решение использует ссылки на массивы:

sub twopush {
  my ($a1, $a2, @elems) = @_;

  push @$a1, @elems;
  push @$a2, @elems;
}

twopush(\@arr1, \@arr2, "extra");

Но это один из тех редких случаев, когда прототипы подпрограмм Perl оказываются полезными.Вы можете указать подпрограмме, что первые два параметра являются массивами, и компилятор будет обрабатывать получение ссылок.

sub twopush(\@\@@) {
  my ($a1, $a2, @elems) = @_;

  push @$a1, @elems;
  push @$a2, @elems;
}

twopush(@arr1, @arr2, "extra");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...