Assuming that you have a flat list, and not a list of pairs, it'll look like this in diplomatic idiomatic Perl 6:
my $in = [ one => 1, two => 2, two => '2.003' ]; my %h; for @$in -> $k, $v { %h{$k}.push: $v; }
(not golfed).
Rakudo doesn't support this kind of autovivification yet, so the .push on the empty hash bucket fails. However this works in Rakudo:
use v6; my $in = [ 'one', 1, 'two', 2, 'two', '2.003' ]; my %h; for @($in) -> $k, $v { if %h{$k} { %h{$k}.push: $v; } else { %h{$k} = [ $v ]; } } say %h.perl; # output: # {"one" => [1], "two" => [2, "2.003"]}
if $in is an Array of pairs instead, you can loop over them, and access .key and .value (a method call with a leading dot but no invocant defaults to $_):
use v6; my $in = [ one => 1, two => 2, two => '2.003' ]; my %h; for @($in) { if %h{.key} { %h{.key}.push: .value; } else { %h{.key} = [ .value ]; } } say %h.perl; # vim: ft=perl6 sw=4 ts=4 expandtab # same output
Again, a complete Perl 6 implementation would allow it shorter like this:
%h{.key}.push: .value for @$in:
Even nicer, but also not yet implement is
my %h = $in.classify: { $_ };
See the documentation of classify for more information.
Update: A nicer way to write the first loop is
for @($in) -> $k, $v { %h{$k} //= []; %h{$k}.push: $v; }
In reply to Re: my array is almost a hash, but keys are not unique. (Perl 6)
by moritz
in thread my array is almost a hash, but keys are not unique.
by Boldra
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |