From: Andrew Gaffney <[EMAIL PROTECTED]>
> Akens, Anthony wrote:
> > I have two hashes, one containing data read in from a file, 
> > one with "current" data.  I'd like to merge the two, adding 
> > any new keys and values into the hash, and for any keys that 
> > exist in both, I'd like the append the values onto the values 
> > for the same key in the original hash.
> 
> Instead of string values in the main hash, you might want to use
> arrays or more hashes. Pardon my syntax as I've never done something
> like this before:
> 
> my $hash1 = { host1 => (760, 760, 759),
>                host2 => (765, 760, 760),
>                host5 => (130, 200) };

I completely agree with the idea. The syntax is a little off though. 
It should be:

my $hash1 = { host1 => [760, 760, 759],
               host2 => [765, 760, 760],
               host5 => [130, 200] };

Notice the square brackets. Your code would be equivalent to

my $hash1 = { host1 => 760, 
              760 => 759,
              host2 => 765, 
              760 => 760,
              host5 => 130, 
              200 => undef};

> my $hash2 = { host1 => (758),
>                host2 => (760),
>                host4 => (450),
>                host5 => (210) };

This is exactly the same as

my $hash2 = { host1 => 758,
               host2 => 760,
               host4 => 450,
               host5 => 210 };


The code depends on whether you use a one-element array or the value 
directly if there is just one value for the key:

%hash1 = (
        host1 => [760, 760, 759],
        host3 => [752],
); # no need to use a hash ref

vs.

%hash1 = (
        host1 => [760, 760, 759],
        host3 => 752,
); # no need to use a hash ref

And whether there can be several values in the second hash.

Assuming that you use the one-element arrays and the second array 
always contains just one value you could write it like this:

foreach my $key (keys %hash2) {
        push @{$hash1{$key}}, $hash2{$key};
}

or 

while (my ($key, $value) = each $hash2) {
        push @{$hash1{$key}}, $value;
}

if you stored single values directly you'd have to split the logic 
into three branches:

while (my ($key, $value) = each $hash2) {
        if (exists $hash1{$key}) {
                if (ref $hash1{$key}) {
                        # 1) already an array
                        push @{$hash1{$key}}, $value;
                } else {
                        # 2) a single value
                        $hash1{$key} = [$hash1{$key}, $value]
                }
        } else {
                # 3) no value yet
                $hash1{$key} = $value;
        }
}

HTH, Jenda
===== [EMAIL PROTECTED] === http://Jenda.Krynicky.cz =====
When it comes to wine, women and song, wizards are allowed 
to get drunk and croon as much as they like.
        -- Terry Pratchett in Sourcery


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to