В 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);