Ответ Скимона Проктора по существу правильный, но я постараюсь объяснить, почему ваш пример не работает. Для начала kv
возвращает «чередующуюся последовательность индексов и значений», так что:
my @s=<a b c d>;
.say for @s.kv;
печатает
0
a
1
b
2
c
3
d
По сути, вы делая один оборот l oop для каждого значения ключа и . Группировка их по парам с помощью rotor
может быть ближе к тому, что вы ищете:
.say for @s.kv.rotor(2)
, который вернет:
(0 a)
(1 b)
(2 c)
(3 d)
Так как с этим мы получили пару значений с индексом, мы можем сделать ...
my @s=<a b c d>;
for @s.kv.rotor(2) -> ($k, $) {
"{@s[$_]} ".print for ($k..^@s.elems);
printf("\n");
}
Обратите внимание, что была также ошибка во внутренней l oop, чей диапазон вышел за пределы фактических индексов в @s , Но, опять же, ответ Шимона, который использует карты, намного короче, идиоматический c и прямой. Это просто вид вашей оригинальной программы. На самом деле мы отбрасываем значения, так что на самом деле это будет:
my @s=<a b c d>;
for @s.keys -> $k {
"{@s[$_]} ".print for ($k..^@s.elems);
printf("\n");
}
Не нужно вообще использовать kv, а просто обойтись с помощью клавиш .