Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hello fellow monks,

I am using the following code to populate a hash with a key and an array of values

$construct{$record->[1]}{$record->[2]} = 0; foreach my $key (keys %construct) { $construct{$key} = [keys %{$construct{$key}}]; } my %TEST; while ((my $key, my $value) = each %construct) { my @values = @$value; $TEST{$key} = \@values; }
How can I perform work on each of the values (i.e. maybe a join) and then print the key with its corresponding list of values?

Thanks

Replies are listed 'Best First'.
Re: How to print a hash of arrays with the key
by blokhead (Monsignor) on Jan 15, 2003 at 19:12 UTC
    %construct and %TEST are identical at the end of this code, is that what you want? I think the first part of your code could be simplified like this:
    my %construct; push @{ $construct{$_->[1]} }, $_->[2] for (@records);
    (where @records is some collection of array refs like you have in your first line of code). Just push onto the appropriate array as you see each item. Having a two-layered hash seems redundant. Your while loop is simply making a copy of the data in %TEST, and doesn't seem to be doing anything to the data.

    How can I perform work on each of the values (i.e. maybe a join) and then print the key with its corresponding list of values?
    I'm not sure I really understand your question. To get back to your data to perform some work on it, you can use the while loop you already have (using $key and @values). I don't know what you mean by "maybe a join" -- since all the arrays are indexed by different keys. Perhaps an example data set would help. To just print the key with its associated list of values:
    while (my ($k,$v) = each %construct) { print "$k has values: " . join(',', @$v) . "\n"; }

    blokhead