Given two (or more) hashes, where each value is a reference to an array how can we merge them?

Two solutions.

Merge including duplicate values

In the first one we just merge the arrays. Duplicate values remain.

examples/merge_hashes_of_arrays.pl

use 5.010;
use strict;
use warnings;
use Data::Dump qw(dump);

my %semesterOne = (
    Jack    => [1, 1, 2, 7],
    Antonie => [2, 1],
);

my %semesterTwo = (
    Jack    => [1, 3],
    Antonie => [2, 4],
    Alex    => [2, 3, 4],
);

my %merged;
for my $hash (\%semesterOne, \%semesterTwo) {
    for my $k (keys %$hash) {
        push @{ $merged{$k} },  @{ $hash->{$k} };
    }
}

say dump \%merged;

examples/merge_hashes_of_arrays.txt

{ Alex => [2, 3, 4], Antonie => [2, 1, 2, 4], Jack => [1, 1, 2, 7, 1, 3] }

Merge excluding value duplication - ensuring values are unique

In the second we only keep distinct values withine each array.

examples/merge_hashes_of_arrays_uniq.pl

use 5.010;
use strict;
use warnings;
use Data::Dump qw(dump);
use List::MoreUtils qw(uniq);

my %semesterOne = (
    Jack    => [1, 1, 2, 7],
    Antonie => [2, 1],
);

my %semesterTwo = (
    Jack    => [1, 3],
    Antonie => [2, 4],
    Alex    => [2, 3, 4],
);

my %merged;
for my $hash (\%semesterOne, \%semesterTwo) {
    for my $k (keys %$hash) {
        @{ $merged{$k} } = uniq ( @{ $merged{$k} }, @{ $hash->{$k} } );
    }
}

say dump \%merged;

As you can see if one of the original arrays had a duplicate value (Jack in semester one had two 1-s) those will be also subject for the unification.

examples/merge_hashes_of_arrays_uniq.txt

{ Alex => [2, 3, 4], Antonie => [2, 1, 4], Jack => [1, 2, 7, 3] }