現在の perl インタープリターの場所は、特殊変数 で見つけることができます$^X
。これは、perl がパスにない場合、または複数のバージョンの perl が利用可能であるが、全体的に同じバージョンを使用していることを確認する場合に重要です。
他の Perl プログラムを含む外部コマンドを実行する場合、それらが実際に実行されたかどうかを判断するのは非常に困難です。検査$?
は永続的な精神的な傷を残す可能性があるため、私はIPC::System::Simple (CPAN から入手可能)を使用することを好みます。
use strict;
use warnings;
use IPC::System::Simple qw(system capture);
# Run a command, wait until it finishes, and make sure it works.
# Output from this program goes directly to STDOUT, and it can take input
# from your STDIN if required.
system($^X, "yourscript.pl", @ARGS);
# Run a command, wait until it finishes, and make sure it works.
# The output of this command is captured into $results.
my $results = capture($^X, "yourscript.pl", @ARGS);
上記の両方の例で、外部プログラムに渡したい引数はすべて に入り@ARGS
ます。上記の両方の例では、シェルも回避されています。これにより、速度がわずかに向上し、シェルのメタ文字が関与する不要な相互作用が回避されます。上記のコードでは、2 番目のプログラムが成功を示すためにゼロの終了値を返すことも想定しています。そうでない場合は、許容される終了値の追加の最初の引数を指定できます。
# Both of these commands allow an exit value of 0, 1 or 2 to be considered
# a successful execution of the command.
system( [0,1,2], $^X, "yourscript.pl", @ARGS );
# OR
capture( [0,1,2, $^X, "yourscript.pl", @ARGS );
長時間実行されるプロセスがあり、生成中にそのデータを処理したい場合は、おそらくパイプで開くか、CPAN のより重い IPC モジュールの 1 つが必要になるでしょう。
そうは言っても、Perl から別の Perl プログラムを呼び出す必要があるときはいつでも、モジュールを使用する方が良い選択かどうかを検討したいと思うかもしれません。別のプログラムを起動すると、起動コストと、プロセス間でデータを移動するための I/O コストの両方の点で、かなりのオーバーヘッドが発生します。また、エラー処理の難しさも大幅に増加します。外部プログラムをモジュールに変換できれば、全体の設計が簡素化されることがあります。
ではごきげんよう、
ポール