Я вижу пару проблем. Один @dirContent явно установлен на <*>, он будет сбрасываться каждый раз, когда вы вводите getDirSize. Результатом будет бесконечный цикл, по крайней мере, до тех пор, пока вы не исчерпаете стек (так как это рекурсивный вызов). Во-вторых, есть специальная запись дескриптора файла для извлечения информации из статистического вызова - подчеркивание (_). См .: http://perldoc.perl.org/functions/stat.html. Ваш код как есть вызывает три раза stat по существу для одной и той же информации (-f, stat и -d). Поскольку файловый ввод-вывод дорог, вам действительно нужно вызвать stat один раз, а затем ссылаться на данные, используя «_». Вот пример кода, который, я считаю, выполняет то, что вы пытаетесь сделать
#!/usr/bin/perl
my $size = 0;
getDirSize(".",\$size);
print "Size: $size\n";
sub getDirSize {
my $dir = shift;
my $size = shift;
opendir(D,"$dir");
foreach my $dirContent (grep(!/^\.\.?/,readdir(D))) {
stat("$dir/$dirContent");
if (-f _) {
$$size += -s _;
} elsif (-d _) {
getDirSize("$dir/$dirContent",$size);
}
}
closedir(D);
}