Невозможно передать массивы в сабвуферы.Подпрограммы принимают список скаляров для аргумента.(И это единственное, что они тоже могут вернуть.)
Вы можете передать ссылку на массив:
func(\@array)
Вы можете передать элементы массива:
func(@array)
Когда мы должны использовать какие?
Если вы хотите передать больше, чем просто элементы массива (например, pass $x
, $y
и @a
), он можетстановиться хитрым, если вы не передадите ссылку.
Если вы собираетесь обрабатывать списки (например, sum mysub grep { ... } ...
), вы можете не захотеть передавать ссылку.
Если вы хотите изменитьмассив (в отличие от простого изменения существующих элементов массива), вам нужно передать ссылку.
Может быть более эффективно передать ссылку для длинных массивов, поскольку создается и помещается одна ссылка в стекбыстрее, чем создание псевдонима для каждого элемента большого массива.Это редко будет проблемой, однако.
Это обычно решается одним из первых двух из вышеперечисленных.Кроме того, это в основном вопрос личных предпочтений.
Кроме того, как мне имитировать передачу по значению в Perl?
sub foo {
my ($x) = @_; # Changing $x doesn't change the argument.
...
}
sub foo {
my @a = @_; # Changing @a or its contents
... # doesn't change the arguments.
}