Я хочу написать скрипт Perl, который начинается в начале дерева каталогов (предоставляется в аргументах командной строки) и рекурсивно перемещается по каждому подкаталогу, выполняя определенное действие для каждого файл.Perl-скрипт, который повторяется через дерево каталогов
Для этого я использую finddepth
, однако он не работает, когда я запускаю сценарий в каталоге, который находится на двух уровнях или более из базового каталога.
Вот мой код:
#!/usr/local/bin/perl -w
use strict;
use File::Copy;
use File::Find;
use File::Basename;
use File::Path;
finddepth(\&file_list, @ARGV);
sub file_list {
my ($file_path, $name, $path, $suffix);
$file_path = $File::Find::name;
($name, $path, $suffix) = fileparse($file_path, /\.*/);
my $fullname = $name . $suffix;
my $file = $fullname;
if ($file =~ /^[^\.].*[^\.pl]$/) {
copy($file, "$file.orig");
open(FILE, "$file");
my @file_data = <FILE>;
close(FILE);
open(FOUT, ">$file") or die " \n File cannot be opened !";
foreach my $line (@file_data) {
if ($line =~ /^\s+Error:/) {
$line =~ s/([^-]\d+)/ \*\*/gc;
print FOUT $line;
}
else {
print FOUT $line;
}
}
close(FOUT);
}
}
Следующие предупреждения/ошибка последовательно брошены:
- Читать на закрытом дескрипторе
- Файл не может быть открыт!
Я не могу понять, почему это происходит. Я постарался сделать свой вопрос максимально конкретным. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Спасибо.
Вы используете 'strict', но почему бы не« предупреждения »? –
Куда уходят эти предупреждения/ошибки? Разве они не показывают имя файла? Номер строки? –
Каково ваше регулярное выражение '/^[^ \.]. * [^ \. Pl] $ /' должно совпадать? – Borodin