On Mon, Jan 21, 2002 at 10:50:06AM -0500, Bernie Cosell wrote:
> On 21 Jan 2002, at 15:12, Simon Cozens wrote:
> 
> > On Mon, Jan 21, 2002 at 03:00:57PM +0000, Robin Houston wrote:
> > > In an ideal world it would behave the same as
> > >   %a = (%b, %c);
> > >   for my $k (keys %a) {
> > >       $a{$k} += $b{$k} if exists($b{$k}) && exists($c{$k});
> > >   }
> > 
> > It's not impossible that it would end up doing just that.
> 
> Is that right? --- that is, add b to a on condition of c, but the actual 
> value from the c hash isn't used at all, and a is *incremented* even 
> though it looks like an assignement [you removed it from your followup, 
> but I think the original was:
>     %a = %b ^+ %c
> That's *REALLY unintuitive [at least to me] to have it work with the 
> above semantics.

I think you're missing the first line, which says:

    %a = (%b, %c);

which initializes %a to have *all* keys and values from %c. In addition
to what's in %c, %a will also have the key/value pairs from %b that are
not in %c. It's in this first line that %c is being used.

For all the keys $k in %a (which includes all the keys in %c - the for()
line could have been written as 'for my $k (keys %c)' as well), if $k
exists in both %b and %c (which would mean $a {$k} equals $c {$k}), we're
adding the value of $b {$k}. This results in $a {$k} == $b {$k} + $c {$k}.

For all keys that are in either %b or %c, but not both, %a will get the
key with the corresponding value.



Abigail

Reply via email to