gps sana Ответов: 1

Не удается рекурсивно прочитать файлы внутри каталогов с помощью Perl?


Я не могу рекурсивно читать файлы внутри каталогов.Здесь $dir1-это каталог, который рекурсивно содержит имена файлов с заданием.Я хочу удалить те файлы, которые начинаются с задачи рекурсивно.Как я могу это сделать?

Ошибка:

Use of uninitialized value in pattern match (m//) at ./generate_dcms_html.pl


Мой input_Directory струтуры:

`-- added
   |-- add.txt
   `-- added1
       |--action
       |   |-- action.txt
       |   `-- task1
       |   |    `-- task1.html
       |   `-- task2
       |       `-- task1.html

       `-- add.html


Ожидаемый:

`-- added
   |-- add.txt
   `-- added1
       |--action
       |   |-- action.txt
       |   `-- task2
       |       `-- task2.html

       `-- add.html


Что я уже пробовал:

sub ProcessDirectory1{
    my ($workdir1) = shift;
 	unless (-d $workdir1)
    {
        warn "argument to DelTask is not a directory.\n";
        return;
    }
    my @dirs1 =  glob "$workdir1/*";

    foreach my $f (@dirs1)
    {
    	my $dirs1=basename($f);
    	{
        if (my $dirs1 =~ /^task/)
        {
          my $filemask1 = $f.'/*';
          print $filemask1;
          unlink glob $filemask1;
          unlink $f;          
        }

        
    }
}
}
ProcessDirectory1($output_dir);

Richard MacCutchan

Еще один неясный / неполный вопрос. Я объяснил вчера (и ранее) информацию, которую мы должны увидеть, но вы все еще не предоставляете ее.

gps sana

Я показал вам информацию.Пожалуйста, посмотрите на это

1 Ответов

Рейтинг:
2

Jochen Arndt

Регулярное выражение должно быть применено к существующей переменной, но вы пытаетесь создать новую с помощью my и есть ненужная скобка:

my $dirs1=basename($f);
{
    if (my $dirs1 =~ /^task/)
Так и должно быть:
my $dirs1=basename($f);
if ($dirs1 =~ /^task/)
# ...
# Remove closing brace too
Вы также не должны использовать имя уже существующей переменной (dirs1 уже используется для массива). Хотя это возможно, это плохой стиль и затрудняет поиск ошибок. Так будет лучше:
my $file_name=basename($f);
if ($file_name =~ /^task/)

[РЕДАКТИРОВАТЬ]
Если вы хотите обрабатывать каталоги рекурсивно, вы должны вызвать ProcessDirectory1 для вложенных каталогов:
foreach my $f (@dirs1)
{
    if (-d $f)
    {
        ProcessDirectory1($f);
    }
    else
    {
        my $filename=basename($f);
        # ...
    }
}
[/РЕДАКТИРОВАТЬ]


gps sana

подкаталог Процесса1{

my ($workdir) = shift;

my @dirs1 = glob " $workdir/*";

foreach my $f (@dirs1) {
chomp ($f);
my $file_name=basename($f);
if ($file_name = ~ / ^task/)
{
печать "если";
мой $filemask1 = $f.'/*';
печатать $filemask1;

отсоединить Глоб $filemask1;
отвязать $Ф;
}

}

}
ProcessDirectory1($output_dir);


Тем не менее у меня есть проблемы с печатью заявлений, которые не работают.

Jochen Arndt

Операторы печати работают.
Но, вероятно, нет имени файла, начинающегося с "task", так что в вашем коде нет оператора print.

gps sana

но у меня есть файлы под подкаталогами, тогда почему он не читает эти файлы.

Jochen Arndt

Решение очень простое:

У вас нет рекурсии!
Вы должны снова вызвать ProcessDirectory1() для каждого каталога, найденного в фактически обработанном каталоге.

Я обновлю свой ответ.