2009-05-27 16 views
2

私は実行するスクリプトを持っています。実行した後、実行するために次のスクリプトに渡す必要のある情報があります。あるPerlスクリプトから別のPerlスクリプトに引数を渡すにはどうすればよいですか?

のUnix/DOSコマンドはとても似ています:

perl -x -s param_send.pl 
perl -x -s param_receive.pl

param_send.plは次のとおりです。

# Receive param 

my $receive_var = $ARGV[0]; 
print "Parameter received: $receive_var";

しかし、何も印刷されません:

# Send param 

my $send_var = "This is a variable in param_send.pl...\n"; 
$ARGV[0] = $send_var; 
print "Argument: $ARGV[0]\n";

param_receive.plです。私は間違っていることを知っていますが、チュートリアルからは、あるスクリプトから次のスクリプトにパラメタを渡す方法を理解できません!

事前に感謝します。

+0

これらのプログラムで何もしていないにもかかわらず、誰もあなたの-xと-sスイッチをコピーしています。 –

答えて

0

FYI、私はperl guyではありません。しかし、一般的には、環境変数を設定し、最初のものから別のスクリプトを呼び出す必要があると思います(環境変数に最初のもののサブプロセスとしてアクセスできます)。最初に引数をコマンドラインで渡します。

あなたのARGV変数は、現在実行中のスクリプトのものにすぎないので、そのようなものを使用して、何かを渡すことはできません。

+0

環境は親プロセスから子プロセスに渡されるため、機能しません。親(シェル)プロセスは、子(perl)がその環境に対して行った変更を認識しません。 – ijw

+0

私が言ったように、私はperlの人ではありませんが、私はあなたが他の言語やOSの機能でそれを行うことができることを知っています。 – crashmstr

+0

コードが同じプロセスで実行されていない限り、環境への変更は決して見られません。これはPerlのことではなく、POSIXのことです。 –

7

あなたはその後、(printを使用)に書き込むか(<>演算子を使用して)から読み取ることができ、第2のプログラム、上の標準入力に最初のプログラムからの標準出力を接続するには、コマンドライン上でパイプ文字を使用することができます。

perl param_send.pl | perl param_receive.pl 

あなたが最初のコマンドの出力は、2番目のコマンドの引数になりたい場合は、xargsのを使用することができます。

perl param_send.pl | xargs perl param_receive.pl 
+0

この解決法は、私が必要とするものとまったく同じように思えます。ありがとう! param_sendスクリプトからparam_receiveスクリプトにパラメータを自由に渡すことができます。 もう一度ありがとうございます。 –

2

@ARGVは、実行時に作成され、保持されません。したがって、2番目のスクリプトは、最初のスクリプトで割り当てた$ARGV[0]を見ることができません。 crashmstrが指摘しているように、2番目のスクリプトを実行するためには、many methodsのいずれかを使用して最初のスクリプトを実行する必要があります。例えば:

my $send_var = "This is a variable in param_send.pl...\n"; 
`perl param_receive.pl $send_var`; 

または%ENVを使用して環境変数を使用する:

my $send_var = "This is a variable in param_send.pl...\n"; 
$ENV['send_var'] = $send_var; 
1

Perlで%ENVハッシュは、これらの変数に対する変更が反映される等PATH、USER、などの環境変数を保持します現在のプロセスとそれが生成する可能性のある子プロセスで 'only'を指定します。親プロセス(この特定のインスタンスではシェルになる)はこれらの変更を反映しないため、 'param_send.pl'スクリプトが終了するとすべての変更が失われます。

あなたは何かなどを行うとしたらVALはときparam_sendが終了失われているので、

#!/usr/bin/perl 
# param_send.pl 
$ENV{'VAL'} = "Value to send to param_recv"; 


#!/usr/bin/perl 
# param_recv.pl 
print $ENV{'VAL'}; 

は、これは動作しないでしょう。 1つの回避策はparam_recv.plをparam_sendから呼び出すことです。PLと、環境変数や引数として値を渡し、

#!/usr/bin/perl 
# param_send.pl 
$ENV{'VAL'} = "Value to send to param_recv"; 
system("perl param_recv.pl"); 

OR 

#!/usr/bin/perl 
# param_send.pl 
system("perl param_recv.pl 'VAL'"); 

その他のオプションは、出力をパイプしたり、難解な解決のために、このPM nodeをチェックアウトする可能性があります。

関連する問題