У вас здесь куча проблем. Вот версия, которая действительно работает:
use strict;
use warnings;
sub dir_list1
{
my $path = $_[0];
for (<$path/*>) {
if (-f $_) {
print "$_\n";
}
else {
print "enter dir: $_\n";
dir_list1($_);
print "leave dir: $_\n";
}
}
}
dir_list1(".");
Что не так с оригинальным кодом:
- Отсутствие
use strict; use warnings;
- Не используется лексическая переменная для
$path
- Использование кавычек вокруг переменной обычно излишне (
"$_"
)
- Имена файлов, возвращаемые оператором glob, включают путь, который вы ему дали
Но фундаментальная проблема заключалась в том, что оператор glob в скалярном контексте нельзя использовать рекурсивно. Используемый итератор привязан к этой конкретной строке кода. Когда вы выполняете рекурсию, итератор все еще возвращает имена файлов из родительского каталога.
Я изменил ваш while
(скалярный контекст) на for
(список контекста). Цикл for
генерирует полный список имен файлов, а затем перебирает его, и его можно использовать рекурсивно.
Я предполагаю, что вы делаете это как учебное упражнение. В противном случае вам следует использовать один из множества модулей для поиска файлов. Вот частичный список:
Я уверен, что я упустил еще кое-что.