Вы всегда должны использовать строгие и предупреждения, чтобы помочь вам отладить ваш код. Например, Perl предупредил бы вас, что @files
не объявлено. Но реальная проблема с вашей функцией заключается в том, что вы объявляете лексическую переменную @paths
при каждом рекурсивном вызове list_dirs
и не возвращаете возвращаемое значение после шага рекурсии.
push @paths, list_dir($eachFile)
Если вы не хотите устанавливать дополнительные модули, вам может помочь следующее решение:
use strict;
use warnings;
use File::Find qw(find);
sub list_dirs {
my @dirs = @_;
my @files;
find({ wanted => sub { push @files, $_ } , no_chdir => 1 }, @dirs);
return @files;
}