Хотя скалярные элементы @_
связаны с данными, которые передаются, сам @_
является другой переменной.Это означает, что $_[1] = "foo"
изменит $_[1]
, но push @_, "foo"
не изменит @_
.В противном случае my $self = shift
будет плохим.
Вам необходимо передать массив в качестве ссылки.
sub del {
my $array_ref = shift;
splice @$array_ref, 2, 1;
return;
}
del \@array;
Если вам абсолютно необходимо сохранить интерфейс del @array
, это одиниз немногих мест, где уместно использовать прототип.
sub del(\@) {
my $array_ref = shift;
splice @$array_ref, 2, 1;
return;
}
del @array;
Прототип \@
сообщает Perl передать @array
по ссылке.Я бы рекомендовал против сделать это по двум причинам.Во-первых, у прототипов есть куча предостережений, которые делают их бесполезными.
Что еще более важно, это делает неочевидным, что del
изменит свои аргументы.Обычно определяемые пользователем функции Perl копируют свои аргументы, поэтому вы можете посмотреть на foo @array
и быть уверенным, что @array
не будет изменен на foo
.Это позволяет быстро просмотреть код для вещей, которые будут влиять на переменную.Эталонный прототип выбрасывает это в окно.Теперь каждая функция должна быть проверена на возможную скрытую передачу по ссылке.