1

ディレクトリ全体を読み取る別のスクリプトを呼び出す 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;
4

6 に答える 6

8

exec現在実行中のプロセスを置き換えます。見る

perldoc -f exec

あなたは見るべきです

perldoc -f system
于 2009-06-10T18:07:36.037 に答える
4

これを使用すると、既存の perl プロセスが呼び出したスクリプトexec置き換えられます。system代わりに使用してください。

withスクリプトが終了execすると、プログラムは終了します。元の perl スクリプトでは、'd スクリプトが終了した後も続行されexecます。systemsystem

詳細については、この質問をご覧ください。

于 2009-06-10T18:07:39.610 に答える
4

コードには 2 つの問題があります。1 つ目は、 の使用に論理的な問題があることですreaddir()。で初めて使用すると、grep()ディレクトリ全体が読み込まれ、grep()一致しないものはすべて破棄されます。条件で読み取るものは他にないwhileため、反復を 1 回も行わずにループを終了します。

2 番目の問題は、 の使用にありexec()ます。マニュアルページにあるように

「exec」関数はシステム コマンドを実行し、戻りません。戻りたい場合は、「exec」の代わりに「system」を使用します。

ループの最初の反復でforeachは、現在のプロセスが exec されたコマンドに置き換えられます。出力が生成される場合にのみ、出力が得られますv-file

ここで使う意味があると思いますsystem()

于 2009-06-10T18:09:17.377 に答える
2

あなたが書いた:

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

while (my $ouvRep = readdir(DIR))

を入力すると@listeFichiers、スカラーまたはリストのコンテキストに応じて、またはreaddir(DIR)それに応じて応答します。そのため、while ループは 0 回ループします。 undef()

とにかくそのwhileループは何に必要ですか?必要なファイルのリストは既にあります。本当に必要だと判断した場合は、そのclosediropendir

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))

または、2 番目のループ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))
于 2009-06-10T19:16:47.287 に答える
1

おそらくParallel::ForkManagerを使用して、フォークでこれを行うと思います。すべてのアイテムに対して、それを処理するプロセスをフォークします。複数の処理を同時に行うことができます。system()完了するまで待つ必要はありません。(結果などを見るのではなく) CGI スクリプトからこれをトリガーしようとしているだけの場合は、ディスパッチャー部分をデーモン化して、すべてを処理するためにそれ自体がオフになり、CGI プロセスがそれなしで終了できるようにすることもできます。

また、簡単なプロセス通信のためにIPC::System::Simpleを参照することもできます。

于 2009-06-11T01:40:58.027 に答える
1

exec 呼び出しが最初にヒットしたときに、プロセスが置き換えられます。ループの 2 回目 (およびそれ以降) の繰り返しには到達しません。

exec の代わりに system (または出力が必要な場合はバッククォート) を使用すると、必要なことが行われるはずです。すでに与えられている回答について、特に満足していないことは何ですか?

于 2009-06-10T20:58:01.920 に答える