To populate it, I would do something like this:# Sorry about the MANY keyword - I would choose a better name # for the secondary data, but I have no clue what would make # sense. my %keyhash = ( $id => { NAME => $name, REF => $ref, MANY => [] } );
Although you may want MANY to be a hash - it really depends on how you want to use your data later.for ( @array1 ) { my ($id,$name,$ref) = split /,/; # You may wish to add some error checking to make sure the # hash key $id does not already exist $keyhash{$id} = { NAME => $name, REF => $ref, MANY => [], } } for ( @array2 ) { my ($id,$name,$ref) = split /,/; # Warn and do nothing if a record is found for which the # $id is not already in %keyhash unless ( defined( $keyhash{$id} ) ) { warn "No such record $id!\n"; next; } push @{$keyhash{$id}{MANY}}, [ $name, $ref ]; }
Finally, to extract the number of records for each ID,
# A little something to get the plurality correct for ( keys %keyhash ) { my $num = @{$keyhash{$_}{MANY}}; printf "%s appeared %d %s\n", $_, $num, $num > 1 ? "times" : "time"; }
I will say my choice of data structures ( hashes instead of arrays ) is really dependant on how you intend using the data later. Hashes, for me, seem to better reflect the relationship between tables better than arrays. YMMV, of course.
Updated 14:04 It was pointed out I had dropped an equals sign. Sigh.
In reply to Re: @array1 vs @array2
by mikfire
in thread @array1 vs @array2
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |