0

WindowsXPでCygwinPerlを使用しています。

サードパーティのプログラムを実行するこのコードがあります。

sub main {
    print("Start Running\n");
    @return = run_exe($execApp, $parm1, $parm2);
    my $returncode = pop @return;
    if ($returncode == 0) {
        print("Success\n");
    }
    else {
        print("Error\n");
    }
}

sub run_exe {
    my ($exe, @parm) = @_;
    my (@output, @return_output);

    @output = system($exe, @parm);

    foreach (@output) {
        next if !/\S/;       # white space line
        s/^(\s*)//g;         # trim from the front for $_
        s/(\s*)$//g;         # trim from the end for $_
        push (@return_output, $_);
    }

    push (@return_output, $?>>8);
    @output = ();

    return (@return_output);
}

これは、成功した場合に出力されます。

Start Running
Return Code: 0
Success

私が欲しいのは、run_exeサブルーチンの実行からの出力を出力しないことです(つまり、リターンコード:0):

Start Running
Success

どうすればこれを達成できますか?助けてください、私はグーグルで検索しましたが、何も見つかりませんでした。

4

2 に答える 2

4

systemプログラムで使用しました。これにより、実行中のプログラムが STDOUT に出力し、プログラムの終了ステータス (数値) を返すことができます。

したがって、現在持っているものは意味@outputがありません.1つの数字しか含まれておらず、実行中のプログラムからの出力として解析することはできません.

おそらく必要なのはバックティックです

`$exe @parm`

または、より明確に、

qx{$exe @parm}

あなたが期待しているように、プログラムからの出力を返し、STDOUTに出力されないようにします。

結果の文字列はコマンド ラインで有効である必要があり、フィールドは適切に引用またはエスケープする必要がある場合があるため、$exeおよびの内容に注意する必要がある場合があることに注意してください。@parm

アップデート

コードをもう一度見てみると、からの終了ステータス期待しているようですsystem。しかし、それを配列にして、配列をループし、空白以外の要素を抽出するのは非常に複雑です! $?結果は、返された配列に追加した値と同じです。

プログラムの出力をそらすには、直接ではなくコマンド シェルから実行する必要があります。そのため、出力を Windows nul デバイスに送信するには、コードは次のようになります。

system('cmd /C', $exe, @parm, '>nul');
return $? >> 8;

実際、サブルーチンをドロップして行を変更することもできます

@return = run_exe($execApp,$parm1,$parm2);
my $returncode = pop @return;

system('cmd /C', $execApp, $parm1, $parm2, '>nul');
my $returncode = $? >> 8;
于 2013-02-27T12:51:57.150 に答える
1

私は今日同じ問題に遭遇したばかりで、非常に多くの脳細胞の前に解決策を見つけたことを思い出しました (脳細胞の約 4 年分前)。古いコードの検索にかなりの時間を費やした後、解決策を見つけました。ここにあります。システム コールをバックティック内に配置し、「2>&1」を追加するだけです。これが例です。

私の $results= nslookup -type=ns stackoverflow.com 2>&1;

システム コールの結果は $results に割り当てられ、出力されません。それがなぜなのか、どのように行われたのか正確には思い出せませんが、そうです。

これは私にとって重要です。なぜなら、私は非常に頻繁に PERL エディタでスクリプトを実行しているからです。大量の印刷を許可すると (つまり、上記のコマンドが何千回も繰り返されると)、大量のシステム メモリが使用されます。最終的にすべてのシステムメモリ。

私はこれが古いトピックであることを知っていますが、今夜私がそうであったように、問題の解決策をマニアックにグーグル検索している次の貧しい、不幸な魂にとって価値があることを願っています.

于 2015-01-24T02:14:18.563 に答える