В Perl 6 передавать массивы функциям одно удовольствие. Достаточно объявить массив в сигнатуре, и Perl поймет, что с этим делать дальше. В том числе, если дальше идут, например, скаляры.
sub f($a, @b, $c) {
say "a = $a";
say "b = @b[]";
say "c = $c";
}
my @arr = <5 7 9>;
f(10, @arr, 20);
Легко видеть, что все аргументы передались как следует, без перемешивания:
a = 10 b = 5 7 9 c = 20
Очень удобно, если сравнивать с Perl 5.
Но теперь возникает другой вопрос: а как передать переменное число скалярных величин так, чтобы они все оказались в одном массиве? Ответ: с помощью звездочки, которая создает так называемый slurpy-параметр.
sub g(*@data) {
say @data;
}
g(3, 5, 7);
Эта программа работает правильно:
[3 5 7]
А вот если не поставить звездочку, то возникнет ошибка, поскольку ожидается один массив, а получены три скаляра:
===SORRY!=== Error while compiling sub-slurpy.pl Calling g(Int, Int, Int) will never work with declared signature (@data) at sub-slurpy.pl:5 ------> <BOL>⏏g(3, 5, 7);