Merging Hashes
Problem
You need to make a new hash with the entries of two existing hashes.
Solution
Treat them as lists, and join them as you would lists.
%merged = (%A, %B);
To save memory, loop over the hashes’ elements and build a new hash that way:
%merged = (); while ( ($k,$v) = each(%A) ) { $merged{$k} = $v; } while ( ($k,$v) = each(%B) ) { $merged{$k} = $v; }
Discussion
The first method, like the earlier recipe on inverting a hash, uses
the hash-list equivalence explained in the introduction.
(%A,
%B)
evaluates to a list of
paired keys and values. When we assign it to
%merged
, Perl turns that list of pairs back into a
hash.
Here’s an example of that technique:
# %food_color as per the introduction %drink_color = ( Galliano => "yellow", "Mai Tai" => "blue" ); %ingested_color = (%drink_color, %food_color);
Keys in both input hashes appear only once in the output hash. If a food and a drink shared the same name, for instance, then the last one seen by the first merging technique would be the one that showed up in the resultant hash.
This style of direct assignment, as in the first example, is easier
to read and write, but requires a lot of memory if the hashes are
large. That’s because Perl has to unroll both hashes into a
temporary list before the assignment to the merged hash is done.
Step-by-step merging using each
, as in the second
technique, spares you that cost and lets you decide what to do with
duplicate keys.
The first example could be rewritten to use the
each
technique: ...
Get Perl Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.