使用.unique(:as ...)和Perl 6中的数字

时间:2017-11-06 12:39:24

标签: perl6

docs中,解释了如何在调用.unique之前规范化列表元素:

  

可选:as参数允许您规范化/规范化   独特之前的元素。这些值被转换为   比较的目的,但它仍然是原始的价值   它到结果列表。

并给出以下示例:

say <a A B b c b C>.unique(:as(&lc))          # OUTPUT: «(a B c)␤»

如果我想将有理数列表唯一,只比较它们的整数部分怎么办?如何在Int之后在括号内调用:as方法?

my @a = <1.1 1.7 4.2 3.1 4.7 3.2>;
say @a.unique(:as(?????))                # OUTPUT: «(1.1 4.2 3.1)␤»

UPD: 在@Håkon的answer的基础上,我找到了以下解决方案:

> say @a.unique(:as({$^a.Int}));
(1.1 4.2 3.1)

> say @a.unique(as => {$^a.Int});
(1.1 4.2 3.1)

是否可以在没有$^a的情况下执行此操作?

UPD2: 是的,就在这里!

> say @a.unique(as => *.Int);
(1.1 4.2 3.1)

> say (3, -4, 7, -1, 1, 4, 2, -2, 0).unique(as => *²)
> (3 -4 7 -1 2 0)

> say @a.unique: :as(*.Int);
(1.1 4.2 3.1)

1 个答案:

答案 0 :(得分:3)

一种方法是将anonymous子例程传递给unique。例如:

my @a = <1.1 1.7 4.2 3.1 4.7 3.2>;
say @a.unique(:as(sub ($val) {$val.Int})); 

<强>输出

(1.1 4.2 3.1)