2017-07-07 6 views
6

List.classifyメソッドは、定義したマッピングによってリストをハッシュに変換できます。Perl 6リストを分類する際に値を変更することはできますか?

{ 
Amelia => [(Amelia 1) (Amelia 2) (Amelia 3)], 
Camelia => [(Camelia 5) (Camelia 6) (Camelia 7)] 
} 

しかし、私が本当にしたいと思います。そのマッピングの結果は、ハッシュキーと元の値

my @list = (
    <Camelia 5>, 
    <Camelia 6>, 
    <Camelia 7>, 
    <Amelia 1>, 
    <Amelia 2>, 
    <Amelia 3> 
    ); 

my %hash = @list.classify: *.[0]; 

say %hash; 

それは分類元thinygsがリストであったため、ハッシュ値は、リストのリストであるですこの:

{ 
Amelia => (1 2 3), 
Camelia => (5 6 7) 
} 

私はいくつかの余分な作業を行うことができ、それは少しあまりにも多くの仕事を思わ:

あなたは :as副詞使用することができます

答えて

9

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

月からのドキュメント発行https://github.com/perl6/doc/issues/1162 –

3

私はほとんどがあると思い、別の文書化されていない副詞:intoは、ありますHashclassify-listのアダプタになります(ただし、メソッド名に "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の副詞を使用しないと得られるものです。私はそこに2つのハッシュがあると思う:

my %hash = Hash.new.classify-list: *.[0], @list, :as(*.[1]); 
関連する問題