roundrobin

roundrobin 在中文里意味着 「设置轮流捡取」。 roundrobin 用于构建 list of lists.

1
2
3
4
5
6
say roundrobin <a b c>, <d e f>, <g h i>;
# OUTPUT: «((a d g) (b e h) (c f i))␤»

say .join(",") for roundrobin([1, 2], [2, 3], [3, 4]);
# OUTPUT: «1,2,3␤
# 2,3,4␤»

一旦输入列表中的一个或多个列表中的元素用光了, roundrobin 不会终止, 而是继续直到所有列表的所有元素用光为止。

1
2
3
4
5
6
7
8
say roundrobin <a b c>, <d e f m n o p>, <g h i j>;
# OUTPUT: «((a d g) (b e h) (c f i) (m j) (n) (o) (p))␤»

say .join(",") for roundrobin([1, 2], [2, 3, 57, 77], [3, 4, 102]);
# OUTPUT: «1,2,3␤
# 2,3,4␤
# 57,102␤
# 77␤»

因此在 ‘zipping’ 操作过程中不会丢失任何数据值。但是,不能从结果序列中收集到哪个输入列表提供的哪个元素的记录。

roundrobin 在将混乱的数据组合到可以进行手动的后处理步骤时非常有用。

roundrobin 有一个非常有意思的例子:

怎么把 N-1 个分隔符插入到 N 列中?

1
2
3
sub insert-separators-between-columns(@columns, @separators) {
roundrobin( @columns, @separators ).flat.join()
}
1
2
3
4
> insert-separators-between-columns(<a b c>, <, |>)
a,b|c
> insert-separators-between-columns(<a b c d>, <, | ,>)
a,b|c,d