Я изучаю perl и понимаю, что общепринятой практикой является распаковка аргументов подпрограммы с помощью shift. Я также понимаю, что обычной и приемлемой практикой является опускание аргументов функции для использования массива @_
по умолчанию.
Учитывая эти две вещи, если вы вызываете подпрограмму без аргументов, @_
может (и будет, если использовать shift) быть изменен. Означает ли это, что вызов другой подпрограммы с аргументами по умолчанию или, по сути, с помощью массива @_
после этого считается плохой практикой? Рассмотрим этот пример:
sub total { # calculate sum of all arguments
my $running_sum;
# take arguments one by one and sum them together
while (@_) {
$running_sum += shift;
}
$running_sum;
}
sub avg { calculate the mean of given arguments
if (@_ == 0) { return }
my $sum = &total; # gets the correct answer, but changes @_
$sum / @_ # causes division by zero, since @_ is now empty
}
Чувство моего чувства говорит мне, что использование shift для распаковки аргументов фактически будет плохой практикой, если ваша подпрограмма фактически не должна изменять переданные аргументы, но я читал в нескольких местах, включая Stack Overflow, что это не плохо практика.
Итак, возникает вопрос: если использование сдвига является обычной практикой, должен ли я всегда считать, что переданный список аргументов может быть изменен как побочный эффект подпрограммы (например, подпрограмма &total
в цитированном примере)? Может быть, способ передать аргументы по значению, поэтому я могу быть уверен, что список аргументов не изменяется, поэтому я мог бы использовать его снова (например, в подпрограмме &avg
в цитируемом тексте)?