Склеить массив ref

Если у меня есть ссылка на массив, как я могу сделать:splice($array, 0, $num); так как сплайс не должен использоваться на ссылках массива согласно документации?
Обновление: Моя проблема с этим заключается в том, что я выполняю соединение в массиве ref, который я передаю в функцию, поэтому при выходе массив не изменяется.

Обновить
Если я сделаю splice(@$array, 0 ,$num) это нарушает рекомендацию не использовать массив ref в соединении? Я запутался в этом. Этот фрагмент работает для меня (для ссылки на массив, который я передаю в функцию, и я склеиваю), но я не уверен, что массив @$ против документов

2 ответа

Используйте его вместо разыменованного массива:

my $arr = [1,2,3];
splice @$arr, 0, 1, 3, 4;
print join '-', @$arr; # 3-4-2-3

Это на самом деле такой же подход с join здесь - при использовании на arrayref, просто разыменовываем его.

Он работает так же внутри сабвуфера, очевидно:

sub splice_it {
  splice @{$_[0]}, 0, 1, 3, 4;
}

my $arr_ref = [1,2,3];
splice_it $arr_ref;
print join '-', @$arr_ref; # still 3-4-2-3

Демо


О, и есть большой шанс, что вы на самом деле сможете соединять массивы напрямую (без разыменования), но, пожалуйста, не надо:

Начиная с Perl 5.14, splice может принимать скалярный EXPR, который должен содержать ссылку на необработанный массив. Аргумент будет разыменован автоматически. Этот аспект сплайсинга считается очень экспериментальным. Точное поведение может измениться в будущей версии Perl.

Чтобы не вводить в заблуждение потенциальных пользователей вашего кода, использующих более ранние версии Perl, с таинственными синтаксическими ошибками, поместите такие вещи в верхнюю часть вашего файла, чтобы показать, что ваш код будет работать только на Perls недавнего выпуска:

use 5.014;    # so push/pop/etc work on scalars (experimental)

Это все еще там, хотя: то же самое поведение с use 5.020;

Вы должны разыменовать ссылку на массив (@$array или же @{$array}),

splice(@$array, 0, $num);
Другие вопросы по тегам