4

system()を使用して他のperlスクリプトを呼び出すperlスクリプトがあります

それは次のようなものです:

my $returnval= system("perl", $path,$val1, $val2,@myarray);

system()は終了ステータスのみを返しますが、スクリプトの出力が必要なため、バッククォートを使用します。

私はそのようなことを試みました:

my $returnval = `$path`;

スクリプトが受け取る必要のあるパラメータを追加するにはどうすればよいですか?

他のperlスクリプトのリターンコードはどのようになりますか?現時点では

exit ($myreturnedvalue);

(方法)複数の値を返すことは可能ですか?

4

5 に答える 5

5

あるperlスクリプトから別のperlスクリプトにデータを移動するためにシェルを通過することは、最善の解決策ではありません。qx()STDOUTに出力されるものはすべて、バッククォートまたはキャプチャすることを知っておく必要があります。他のスクリプトからの使用exit ($var)は、適切にキャプチャされない可能性があります。必要になりますprint $var。しかし、そうしないでください。

代わりに、他のスクリプトをモジュールにして、サブルーチンを直接使用してください。これは単純な例です。

bar.pm:

use strict;
use warnings;

package bar;  # declare our package

sub fooz {             # <--- Our target subroutine
    my $in = shift;    # passing the input
    return $in * 5;    # return value
}
1; # return value must be true

main.pl:

use strict;
use warnings;
use bar;   # bar.pm must be in one path in @INC

my $foo = bar::fooz(12);  # calling fooz from our other perl script
print "Foo is $foo\n";

学ぶべきことはまだたくさんあります。ドキュメントを読むことをお勧めします。

于 2012-06-03T13:45:05.523 に答える
4

IPC :: System::Simpleが必要ですcapturex

use IPC::System::Simple qw( capturex );
my $output = capturex("perl", $path, $val1, $val2, @myarray);

エラーも処理します。

于 2012-06-03T20:27:48.743 に答える
3

バックティックは、シェルで行う直接呼び出しのように機能します。

you@somewhere:~$ ./script.pl --key=value

基本的にはと同じです

my $returnval = `./script.pl --key=value`;
于 2012-06-03T13:13:45.267 に答える
2

引数を渡すと同時に出力をキャプチャする他のプログラムを呼び出すために、私は次の大ファンですIPC::Run

use IPC::Run 'run';

my $exitcode = run [ $command, @args ], ">", \my $output;

# $exitcode contains the exit status and
# $output contains the command's STDOUT data
于 2012-06-03T14:20:56.890 に答える
1

これはあなたが望むことをしませんか?

my $returnval = `$path $val1 $val2 @myarray`;

ただし、@ Quentinは、この便利なアドバイスを追加します。渡したい値がfoo "barシェルにある場合は、のようなことを行う必要があります"foo \"bar"。システムに追加の引数を使用すると、そのカードが使用されます。バックティックを使用することはできません。必要なシェルコマンドを手動で作成する必要があります。

于 2012-06-03T13:11:57.177 に答える