Похоже, вы неправильно настраиваете% returnArray2d.
Предполагая, что @language содержит нужные языковые идентификаторы вместо:
$returnArray2d{ @language[$language] } = [@$eng];
Вы захотите это:
$returnArray2d{ $language[$language] } = [@$eng];
Кроме того, вам следует избегать использования одного и того же имени для массива и скалярного значения (это работает, но это сбивает с толку) (см. @Language / $ language в вашем коде).
Наконец, вы правильно выполняете итерацию по каждому ключу% newwordsList, однако вы захотите вычесть 1 из итерации, чтобы не проходить через конец массива:
for my $ind ( 0 .. @{ $newwordsList{$key} } ) {
Должно быть:
for my $ind (0 .. @{ $newwordsList{$key} } - 1) {
Или (как отметил Дэвид в комментариях) вы можете сделать:
for my $ind ( 0 .. $#{ $newwordsList{$key} } ) {