2017-07-07 26 views
6

Metoda może przekształcić listę w hasz według wybranego przeze mnie odwzorowania. Wynikiem tego odwzorowania jest klawisz krzyżyka i oryginalna wartośćCzy mogę modyfikować wartości, sklasyfikowując listę Perla 6?

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

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

say %hash; 

Wartości hash są wykazy list ponieważ oryginalne thinygs klasyfikowane były to listy:

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

Ale ja tak naprawdę chcę to:

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

mogłem zrobić kilka dodatkowych prac, ale to wydaje się nieco zbyt dużo pracy:

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; 

Odpowiedz

9

Można użyć :as przysłówka:

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]} 

(Niestety, to nie wydaje się być documented jeszcze).

+0

Wiedziałem, że musi być coś! –

+1

Doktorze Doc od stycznia https://github.com/perl6/doc/issues/1162 –

3

Jest jeszcze nieudokumentowane przysłówek :into, co moim zdaniem jest głównie tam być adapterem do classify-list w Hash (chociaż coś z "listą" w nazwie metody powinno być w 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; 

Ta forma wydaje się mieć więcej sensu, ale to także otrzymujesz, gdy nie używasz przysłówka :into. Myślę, że są tam dwa skróty:

my %hash = Hash.new.classify-list: *.[0], @list, :as(*.[1]); 
Powiązane problemy