Как я могу повторно вызывать другой скрипт?

Я пытаюсь написать сценарий Perl, который вызывает другой сценарий, который читает весь каталог. Я не получаю ошибок, но и не получаю ожидаемого результата. Я ничего не вижу на экране.

Мне не нужно ничего выводить на экран. Сценарий, который я вызываю в операторе exec(), должен читать каждый файл изображения в каталог DIR и создавать файл, в котором хранятся некоторые данные, извлеченные из этого изображения. Затем сценарий в операторе exec() должен выполняться в цикле до тех пор, пока не будут прочитаны все изображения в каталоге.

#!/usr/bin/perl -w
use strict;
use warnings;
use diagnostics;
use CGI qw/:standard/; 
use CGI::Carp 'fatalsToBrowser';

my $dir = '/FilesToRead/';

my $fichier;
my $ligne;
my $mimetype;
my @listeFichiers;

my $cgi = CGI -> new();

opendir (DIR, $dir) or die "Impossible d'ouvrir $dir: $!";
@listeFichiers = grep {/\.mem$/ && -f "$dir/$_"} readdir (DIR);

while (my $ouvRep = readdir(DIR))
{
    foreach $fichier (@listeFichiers)
    {
        exec "v-file ./param.par ./Picture/$fichier -PM_overflow 3000000" or die "Script perl ne s'est pas execute";
    }
}   
closedir DIR;

person user105265    schedule 10.06.2009    source источник
comment
Всем спасибо за ответы. Я все еще недоволен и отредактировал свой вопрос.   -  person user105265    schedule 10.06.2009
comment
@unknown Ты глупый. В этом сценарии exec v-file произойдет только один раз. После этого ваш скрипт перестанет работать, так как он будет заменен v-файлом. Кстати, при чем здесь CGI?   -  person Sinan Ünür    schedule 11.06.2009


Ответы (6)


exec заменяет текущий запущенный процесс. Видеть

perldoc -f exec

Ты должен посмотреть на

perldoc -f system
person Sinan Ünür    schedule 10.06.2009

когда вы используете exec, он заменяет существующий процесс perl вызванным вами скриптом. Вместо этого используйте system.

С exec программа завершается, когда завершается сценарий exec'd. С system исходный сценарий Perl продолжается после завершения сценария system'd.

Посмотрите на этот вопрос для получения дополнительных сведений.

person Nathan Fellman    schedule 10.06.2009
comment
Или обратные тики system request - person Copas; 10.06.2009

У вас есть две проблемы с вашим кодом. Во-первых, при использовании вами readdir() возникает логическая проблема. При первом использовании с grep() он считывает весь каталог и отклоняет все, что не соответствует grep(). В условии while читать больше нечего, поэтому цикл завершается без единой итерации.

Вторая проблема связана с использованием вами exec(). Как сказано на странице руководства

Функция "exec" выполняет системную команду и никогда не возвращает - используйте system "вместо" exec ", если вы хотите, чтобы она вернулась.

Первая итерация вашего цикла foreach заменяет текущий процесс командой exec'd. Вы получите результат только в том случае, если v-file произведет его.

Я думаю, вы хотите использовать здесь system().

person Steve Madsen    schedule 10.06.2009

Вы написали:

opendir (DIR, $dir) or die "Impossible d'ouvrir $dir: $!";
@listeFichiers = grep {/\.mem$/ && -f "$dir/$_"} readdir (DIR);

while (my $ouvRep = readdir(DIR))

После того, как вы заполните @listeFichiers, readdir(DIR) ответит undef или () в зависимости от скалярного контекста или контекста списка. Итак, ваш цикл while будет повторяться ноль раз.

Зачем вам вообще нужен этот цикл while? У вас уже есть список нужных файлов. Если вы решите, что он вам действительно нужен, тогда closedir и _ 7_ до того, как

opendir (DIR, $dir) or die "Impossible d'ouvrir $dir: $!";
@listeFichiers = grep {/\.mem$/ && -f "$dir/$_"} readdir (DIR);
closedir DIR;

opendir (DIR, $dir) or die "Impossible d'ouvrir $dir: $!";
while (my $ouvRep = readdir(DIR))

Или вы можете вызвать rewinddir перед вторым while циклом.

opendir (DIR, $dir) or die "Impossible d'ouvrir $dir: $!";
@listeFichiers = grep {/\.mem$/ && -f "$dir/$_"} readdir (DIR);

rewinddir (DIR);

while (my $ouvRep = readdir(DIR))
person glenn jackman    schedule 10.06.2009
comment
Это будет SAQ: perldoc -f rewinddir. perldoc perlfunc перечисляет все функции Perl. - person Sinan Ünür; 10.06.2009

В самый первый раз, когда выполняется вызов exec, ваш процесс будет заменен. Вторая (и последующие) итерации цикла никогда не будут достигнуты.

Если вы используете system (или обратные кавычки, если хотите вывод) вместо exec, он должен делать то, что вы хотите. Что конкретно насчет уже данных ответов, что вас не устраивает?

person Chris Simmons    schedule 10.06.2009

Думаю, я бы сделал это с помощью fork, возможно, с помощью Parallel :: ForkManager. Для каждого элемента вы создаете процесс, который его обрабатывает. Вы можете обрабатывать несколько вещей одновременно. Вам не нужно ждать, пока system() закончит. Если вы просто пытаетесь запустить это из сценария CGI (вместо того, чтобы видеть результаты и т. Д.), Вы можете даже захотеть демонизировать часть диспетчера, чтобы он ушел сам по себе, чтобы обработать все, и процесс CGI может завершиться без этого.

Вы также можете посмотреть IPC :: System :: Simple для упрощения взаимодействия процессов .

person brian d foy    schedule 11.06.2009