Это зависит от того, что вы делаете с теми, кто в ваших подводных лодках.Вот несколько заметок, которые могут помочь
Если вы передадите ссылку и будете работать со ссылкой
func(\@ary);
...
sub func {
my ($ra) = @_;
...
push @$ra, @some_values; # changes @ary in the caller
}
, то вы только что изменили @ary
в вызывающей стороне.
Однако, если вы создаете локальную копию в подпункте
sub func {
my ($ra) = @_;
my @local_ary = @$ra;
...
return \@local_ary; # return reference to brand new @local_ary
}
, тогда изменения на @local_ary
не влияют на @ary
в вызывающем абоненте (если только это не связано с возвратом курса -- перезаписывается им, или возвращается push
, редактируемый на нем).
Другой момент: аргументы, передаваемые в массив, имеют псевдоним в @_
, так что если в подпрограмме вы работаете с $_[0]
(и т. д.) затем вы напрямую изменяете данные в вызывающей стороне.
Из того, что вы показываете, ясно, что у вас есть один элемент в @lines_r
, который сам является ссылкой на массив.Как ты это понял, трудно понять, не увидев код.Одна возможность состоит в том, что вы вернули arrayref из некоторой функции, return \@local_ary
, которую вы не разыменовали в вызывающей программе, а просто добавили ее в @this
или @that
(на что ссылается $list_r
).
Несколько комментариев к коду в вопросе
&
перед сабвуфером имеет тонкие эффекты, которые вам почти наверняка не нужны.Раньше он был нужен давным-давно, но теперь он не используется и не должен использоваться для «нормального» вызова.
Массивы передаются в подпункт по ссылке, что хорошо, так какизбегает возможного огромного количества копирования данных.Однако вы четко возвращаете список, так как он присваивается массивам.Если в этих массивах может быть много данных, лучше вернуть ссылку и разыменовать ее в вызывающей стороне
my $ra = func(...); # func() returns an array reference
my @ary = @$ra;
или
my @ary = @{ func(...) };
Я бы рассмотрел всегда возвращая ссылку на массив с данными (в отличие от небольшого набора скалярных переменных, которые нужно вернуть в список, где выбор зависит только от предпочтений вызывающего).
Наконец, будьте очень, очень осторожны с тем, что выделать, если вы передадите массив по ссылке и назначите возврат этому же массиву.