2017-07-07 94 views
6

List.classify方法可以通過我定義的映射將列表轉換爲散列。該映射的結果是哈希鍵和原始值我可以在分類Perl 6列表時修改值嗎?

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; 

回答

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呢。)

+0

我知道必須有東西! –

+1

1月份的文件問題https://github.com/perl6/doc/issues/1162 –

3

還有一個無證副詞:into,我認爲主要是有成爲classify-listclassify-listHash(儘管方法名稱中的「list」應該在List):

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]); 
相關問題