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

My question is how would I combine @hosts with @hits. Combining lists was already discussed amongst the monks, however I was wondering how you would do this having multiple keys and still keep references to their values @hits. A simple example of the document:
@1=(H1, H2, H3, H1, H2, H3, H1, H2, H3); @2=(23, 42, 34, 63, 33, 66, 22, 33, 49);
How could I make those into a hash with only H1, H2, H3 and have the corresponding values H1{23, 63, 22} and so on? Any help or a point in the right direction would help? Thanks!

Replies are listed 'Best First'.
Re: Combining 2 Lists into a Hash revisted
by GrandFather (Saint) on Aug 14, 2007 at 02:55 UTC

    The key is realizing that a hash element can store a reference to something else (such as an array). For a good discussion of the technique see perllol. Sample code looks like:

    use strict; use warnings; my @array1= qw(H1 H2 H3 H1 H2 H3 H1 H2 H3); my @array2= (23, 42, 34, 63, 33, 66, 22, 33, 49); my %hash; push @{$hash{$array1[$_]}}, $array2[$_] for 0 .. $#array1; print "$_: @{$hash{$_}}\n" for sort keys %hash;

    Prints:

    H1: 23 63 22 H2: 42 33 33 H3: 34 66 49

    Also see perlref and perldata.


    DWIM is Perl's answer to Gödel
Re: Combining 2 Lists into a Hash revisted
by dwm042 (Priest) on Aug 14, 2007 at 11:39 UTC
    This is one way of doing it:

    #!/usr/bin/perl use warnings; use strict; package main; my @one=('H1', 'H2', 'H3', 'H1', 'H2', 'H3', 'H1', 'H2', 'H3'); my @two=(23, 42, 34, 63, 33, 66, 22, 33, 49); my %hash = (); # associate an anonymous array with each hash key. # initiate the array if key doesn't exist, else # just push the value onto the key. for( my $i = 0; $i < scalar @one; $i++ ) { unless ( defined ( $hash{$one[$i]} ) ) { $hash{$one[$i]} = [ $two[$i] ]; } else { push @{$hash{$one[$i]}}, $two[$i]; } } foreach( sort keys %hash) { print "$_ : "; foreach my $val (@{$hash{$_}}) { print " $val "; } print "\n"; }
    The output is:

    ~/perl/monks$ ./array-to-hash.pl H1 : 23 63 22 H2 : 42 33 33 H3 : 34 66 49