in reply to my array is almost a hash, but keys are not unique.
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; }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: my array is almost a hash, but keys are not unique. (Perl 6)
by Boldra (Curate) on Apr 03, 2009 at 09:16 UTC | |
by moritz (Cardinal) on Apr 03, 2009 at 09:25 UTC |