in reply to my array is almost a hash, but keys are not unique.

Note that in Perl 6 => constructs a Pair, it's not the same as a comma.

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
    That's excellent, thanks Moritz!

    I'd seen something recently about how for can work on pairs, but seeing it used to solve a problem I'm working on makes it much clearer.

    The final classify example has me really puzzled. I can't see the array creation, nor see what the test does.

    In my current program, the $in arrayref is defined by doing a file, so I suppose I would have the option in perl 6 of doing that file as perl6, and getting pairs.

    BTW, what do you mean by "diplomatic perl 6" ? Is that something like "perl 6, no matter who you ask", because different people have different ideas what's going to be in it?


    - Boldra
      The final classify example has me really puzzled. I can't see the array creation, nor see what the test does.

      I omitted the array creation, because it's the same as above (array of pairs)

      The test does basically nothing, it just returns the Pair unchanged. Since it is supposed to return a Pair anyway, it nicely fits into what .classify attempts.

      BTW, what do you mean by "diplomatic perl 6"

      I meant to write 'idiomatic', made a typo, and picked the wrong suggestion from my spell checker :-)