29

Perl は、外部プログラムを実行する (私が知っている) 3 つの方法をサポートしています。

system:

   system PROGRAM LIST

次のように:

system "abc";

次のようなバッククォート:

`abc`;

次のようにパイプを介して実行します。

open ABC, "abc|";

それらの違いは何ですか?私が知っていることは次のとおりです。

  1. バッククォートとパイプを使用して、コマンドの出力を簡単に取得できます。
  2. それだけです(今後の編集でさらに?)
4

4 に答える 4

36
  • system():コマンドを実行し、コマンドの終了ステータスを返します
  • backticks:コマンドを実行し、コマンドの出力を返します
  • パイプ:コマンドを実行し、ハンドルとして使用できるようにします

また、バックティックは実行されたプログラムのSTDOUTを変数にリダイレクトし、システムはそれをメインプログラムのSTDOUTに送信します。

于 2009-04-28T10:09:17.320 に答える
3

perlipcのドキュメントでは、Perl から他のプロセスと対話できるさまざまな方法が説明されています。また、perlfuncのオープン ドキュメントでは、パイプされたファイルハンドルについて説明されています。

  • システムはその出力を標準出力 (およびエラー) に送信します。
  • バッククォートは標準出力をキャプチャして返します (標準エラーではありません)。
  • パイプ オープンを使用すると、出力をキャプチャしてファイル ハンドルから読み取るか、ファイル ハンドルに出力して、それを外部コマンドの入力として使用できます。

クロスプラットフォームのエッジ ケースでこれらの詳細を処理するモジュールもあります。

于 2009-04-28T18:21:42.377 に答える
2

システムは、アプリケーションの終了値も返します(WindowsではERRORLEVEL)。パイプを読み取って閉じると余分なコードが追加されるため、パイプの使用は少し複雑になります。最後に、それらは異なることをすることを意図した異なる実装を持っています。パイプを使用すると、実行されたアプリケーションと通信できますが、他のコマンドでは(簡単に)通信できません。

于 2009-04-28T10:11:42.010 に答える
1

プログラムの終了ステータスの取得は に限定されませんsystem()。を呼び出すclose(PIPE)と終了ステータスが返され、 から 3 つのメソッドすべての最新の終了ステータスを取得できます$?

また、ご注意ください

readpipe('...')

と同じです

`...`
于 2009-04-28T17:50:26.710 に答える