Склеить массив 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);