2011-12-20 14 views
1

私は誰か他の人が書いたスクリプトを修正しようとしています。別のperlスクリプトの途中からシステムコールを使ってperlスクリプトから値を取得できますか?

私が書いたスクリプトは、関連するすべてのデータをスペースで区切って出力するprint行で終了します。

例:print "$sap $stuff $more_stuff";

私は別のperlスクリプトの途中で、このデータを使用したいと私はそれが私が書いたスクリプトにシステムコールを使用して可能かどうか分かりません。

例:これはsystem("./sap_calc.pl $id"); #obtain printed data from sap_calc.pl here

を行うことができますか?そうでない場合は、どうすればいいですか?


やや関連するが、 system()を使用していない:

How can I get one Perl script to see variables in another Perl script?

How can I pass arguments from one Perl script to another?

+2

使用している機能のドキュメントをお読みください。 "perldoc -f system"は、第3段落の質問に答えます。 " は、コマンドからの出力をキャプチャするために使用します。 は単に..." – tadmc

答えて

5

あなたが探している "バックティック演算子。"

perlopのセクション「見積りのような演算子」をご覧ください。一般

、プログラムの出力をキャプチャすることは、このように書きます:バッククォート演算子はSTDOUT のみをキャプチャすること

my $output = `/bin/cmd ...`; 

マインド。だから、すべてのもの(STDERRも)をキャプチャするには、コマンドに通常のシェルリダイレクト "2>&1"を追加する必要があります。

+0

s/STDIN/STDOUT/ – ephemient

+0

私はそれを実行しました代用。ありがとう、@ephemient –

+3

STDERRに手を差し伸べる必要がある場合は、['open3'](http://search.cpan.org/perldoc?IPC::Open3)もあります。 –

4

stdoutに出力されたデータを他のスクリプトから使用する場合は、backticks or qx()を使用する必要があります。

systemは、実際の出力ではなく、シェルコマンドの戻り値のみを返します。

これを行う適切な方法は、moduleを構築するか、単にdoを使用して、実際のコードを他のスクリプトにインポートすることです。

一般的には、「単純化」の方法としてシステム/シェルに頼るよりも、すべてのperlソリューションを使用する方がよいでしょう。

myfile.pl:

sub foo { 
    print "Foo"; 
} 
1; 

main.pl:

do 'myfile.pl'; 
foo(); 
1

perldoc perlipc

バッククォート、シェルに、(文字列としてコマンドの標準出力が得られるように、または配列、状況に応じて)。それらは、より明確に引用符のような形のqx演算子として書くことができます。

@lines = `./sap_calc.pl $id`; 
@lines = qx(./sap_calc.pl $id); 
$all = `./sap_calc.pl $id`; 
$all = qx(./sap_calc.pl $id); 

openqxが行うように)ストリーミングの代わりにすべてを一度にメモリに読み込むためにも使用することができます。これは、シェルをバイパスすることもできます。これにより、あらゆる種類の引用問題が回避されます。

open my $fh, '-|', './sap_calc.pl', $id; 
while (readline $fh) { 
    print "read line: $_"; 
} 
関連する問題