## untested code follows ... my($max,$min) = @array1 > @array2 ? (\@array1, \@array2) : (\@array2, \@array1); my @keys = qw/ year month day hhmm /; my @newarray; for my $i (0 .. @$max) { last if $i >= @$min; if(@keys == grep { $array1[$i]->{$_} eq $array2[$i]->{$_} } @keys) { push @newarray => { %{ $array1[$i] }, data2 => $array2[$i]->{data2} }; } else { push @newarray => $array1[$i], $array2[$i]; } }