Прежде всего ваша функция никогда не должна возвращать данные, изменяя глобальную переменную. Вместо этого верните список.
Что касается эффективности, Perl имеет удивительно большие накладные расходы при вызове функций. Поэтому для больших структур данных я бы предпочел нерекурсивный подход. Вот так:
use Data::Dumper;
my $array = [
0,
[1],
2,
[3, 4, 5],
[6, [7, 8, 9 ]],
[10],
11,
];
my @mylist = get_list($array);
print Dumper (\@mylist);
sub get_list {
my @work = @_;
my @result;
while (@work) {
my $next = shift @work;
if (ref($next) eq 'ARRAY') {
unshift @work, @$next;
}
else {
push @result, $next;
}
}
return @result;
}
Обратите внимание, что форматирование, которое я здесь использую, соответствует рекомендациям perlstyle. Мы все знаем бесполезность спора о едином истинном стиле скобок. Но, по крайней мере, я собираюсь предложить вам уменьшить отступ в 8 пробелов. Существует исследование в этой области, и было показано, что понимание кода улучшается с отступами в диапазоне 2-4. Прочитайте Код завершен для подробностей. Для молодых людей не имеет значения, где вы находитесь в этом диапазоне, но пожилые программисты, чье зрение улучшится, найдут лучший отступ. Прочитайте Советы по Perl , чтобы узнать больше.