追記

真面目に解いてみました。 Problem20を先にして使えるなってことで
そのまま流用しただけなんですがね。

#!/usr/bin/perl
use strict;
use warnings;

print "Answer is ", p16(1000), "\n"; # Answer is 1366

sub p16 {
    my ($times) = @_;
    my @array1 = (2);

    for my $i (2..$times) {
        my @array2 = (2);

        @array1 = multi_operation(\@array1, \@array2);
    }

    my $answer = 0;
    map {$answer += $_;} @array1;

    return $answer;
}

sub multi_operation {
    my ($array_ref1, $array_ref2) = @_;

    my @answer;
    my $length1 = (scalar @{$array_ref1}) - 1;
    my $length2 = (scalar @{$array_ref2}) - 1;

    for my $j (0..$length1) {
        for my $i (0..$length2) {
            my $mul = $array_ref1->[$j] * $array_ref2->[$i];
            my $div = 0;
            my $mod = $mul;

            if ($mul >= 10) {
                $div = int($mul / 10);
                $mod = $mul % 10;
                $answer[$i + $j + 1] += $div;
            }

            $answer[$i + $j]     += $mod;

            if ($answer[$i + $j] >= 10) {
                $answer[$i + $j + 1] += int($answer[$i + $j] / 10);
                $answer[$i + $j]     = $answer[$i + $j]  % 10;
            }
        }
    }

    return @answer;
}