Вы не извлекаете предоставленный параметр $file
в функции print_file_names()
.
Должно быть:
sub print_file_names()
{
my $file = shift;
...
}
Ваш тест -d
во внешнем цикле тоже выглядит неправильно, кстати. Вы говорите next if -d ...
, что означает, что он пропустит внутренний цикл для каталогов, который, кажется, является полной противоположностью того, что вам требуется. Единственная причина, по которой он работает, это то, что вы тестируете $file
, которое является только именем файла относительно пути, а не полным именем пути.
Примечание также:
- Perl в Windows прекрасно справляется с
/
в качестве разделителя пути
- Установите родительский каталог один раз, а затем извлекайте другие пути из этого
- Используйте
opendir($scalar, $path)
вместо opendir(DIR, $path)
nb: непроверенный код следует:
use strict;
use warnings;
use FileHandle;
my $parent = "D:/PERL/perl_programes/parent_directory";
my ($par_dir, $sub_dir);
opendir($par_dir, $parent);
while (my $sub_folders = readdir($par_dir)) {
next if ($sub_folders =~ /^..?$/); # skip . and ..
my $path = $parent . '/' . $sub_folders;
next unless (-d $path); # skip anything that isn't a directory
opendir($sub_dir, $path);
while (my $file = readdir($sub_dir)) {
next unless $file =~ /\.html?$/i;
my $full_path = $path . '/' . $file;
print_file_names($full_path);
}
closedir($sub_dir);
}
closedir($par_dir);
sub print_file_names()
{
my $file = shift;
my $fh1 = FileHandle->new($file)
or die "ERROR: $!"; #ERROR HERE
print("$file\n");
}