如果列表末尾的数据更重要,并且我希望 :partial list 保留在列表的开头,同时保留初始顺序,我会这样做:
> my @a = (0,1,2,3,4,5,6,7,8,9);
[0 1 2 3 4 5 6 7 8 9]
> say @a.rotor(4, :partial)
((0 1 2 3) (4 5 6 7) (8 9)) # not what I want; important data at end gets cut off;
> say @a.reverse.rotor(4, :partial).reverse.map({$_.reverse});
((0 1) (2 3 4 5) (6 7 8 9)) # this is what I want
Run Code Online (Sandbox Code Playgroud)
有没有办法避免 3 个“反向”操作?是否可以添加 :fromEnd 副词?
my @a = (0,1,2,3,4,5,6,7,8,9);
my @b = @a.rotor(4, :partial)».elems.reverse;
say @a.rotor(|@b);
Run Code Online (Sandbox Code Playgroud)
你可以用@a.rotor(2,4,4)还是通用一点的@a.rotor(@a
% 4,slip 4 xx *)。当然,你可以定义函数
multi batch ( $_, $n, :from-end($)! ) {
.rotor: .elems % $n, slip $n xx *
}
say batch ^10, 4,:from-end; #or even
say (^10).&batch(4):from-end;
Run Code Online (Sandbox Code Playgroud)