List.classify方法可以通过我定义的某个映射将列表转换为哈希。该映射的结果是散列键和原始值
my @list = (
<Camelia 5>,
<Camelia 6>,
<Camelia 7>,
<Amelia 1>,
<Amelia 2>,
<Amelia 3>
);
my %hash = @list.classify: *.[0];
say %hash;
哈希值是列表列表,因为它分类的原始thinygs是列表:
{
Amelia => [(Amelia 1) (Amelia 2) (Amelia 3)],
Camelia => [(Camelia 5) (Camelia 6) (Camelia 7)]
}
但是,我真的想要这个:
{
Amelia => ( 1 2 3 ),
Camelia => ( 5 6 7 )
}
我可以做一些额外的工作,但这似乎有点太多了:
my @list = (
<Camelia 5>,
<Camelia 6>,
<Camelia 7>,
<Amelia 1>,
<Amelia 2>,
<Amelia 3>
);
my %hash = @list
.classify( *.[0] )
.kv
.map( {
$^a => $^b.map: *.[*-1]
} )
;
say %hash;
答案 0 :(得分:9)
您可以使用:as
副词:
my @list = (
<Camelia 5>,
<Camelia 6>,
<Camelia 7>,
<Amelia 1>,
<Amelia 2>,
<Amelia 3>
);
my %hash = @list.classify: *.[0], as => *.[1];
say %hash; # {Amelia => [1 2 3], Camelia => [5 6 7]}
(不幸的是,它似乎还不是documented。)
答案 1 :(得分:3)
还有另一个未记录的副词:into
,我认为它主要是something like this, which many professional sites use to select our options.中的classify-list
的适配器(尽管方法名称中带有“list”的内容应该在{ {3}}):
my @list = (
<Camelia 5>,
<Camelia 6>,
<Camelia 7>,
<Amelia 1>,
<Amelia 2>,
<Amelia 3>
);
@list.classify: *.[0], :into(my %hash), :as( *.[1] );
say %hash;
这种形式似乎更有意义,但这也是你不使用:into
副词时得到的结果。我认为那里有两个哈希:
my %hash = Hash.new.classify-list: *.[0], @list, :as( *.[1] );