2

最近、「do」を使用して別のperlスクリプトを呼び出すperlスクリプトがあります。すなわち。

do "./script2.pl $arg1 $arg2";

私のscript2.plは、2つの引数を使用するように設計されています。

ただし、上記の方法でscript2.plを呼び出しても、引数はscript2.plに渡されません。

「system」を使用する別の方法があることは知っていますが、script1.plは「require」を介していくつかの変数値を取得する必要があります。

実際に「do」を使用して、script2に引数を渡すことはできますか?

4

5 に答える 5

13

呼び出しているスクリプトが引数を予期している場合、変数でそれらを予期します@ARGV。を使用している場合do@ARGV呼び出し元のスクリプトの が呼び出されたスクリプトに表示されます。

{
    local @ARGV = ($arg1, $arg2);
    do './script2.pl';
}

このように使用すると、ブロックの最後にlocal古い値が復元されます。@ARGV

@ARGV_old = @ARGV;
@ARGV = ($arg1,$arg2);
do './script2.pl';
@ARGV = @ARGV_old;
于 2012-06-24T05:07:03.307 に答える
4

簡単な答えは、system()引数を使用して別のスクリプトを呼び出したい場合に、おそらく使用したいということです。

use autodie;
system('./script2.pl', $arg1, $arg2);

# OR if you don't want to install autodie from CPAN
system('./script2.pl', $arg1, $arg2) == 0
    or die "cannot run script2.pl: $!";

インタープリターを共有する必要がある場合は、おそらくこれをまったく別の方法で行いたいと思うでしょう。たとえば、簡単なスクリプトの場合、次のrequireように使用することがあります。

our $SHARED_VALUE = 0;
our $OTHER_VALUE = 42;

require 'script2.pl';

ではscript2.pl、次を定義できます。

our ($SHARED_VALUE, $OTHER_VALUE);

script2.plrequire によってロードされると、これらの変数が設定されます。これはまだ最善の方法ではありません。

さらに良いのは、パッケージを使用してコードを共有することですが、それは質問の範囲を超えてしまいます。

于 2012-06-24T02:28:50.883 に答える
1

変数を共有したい場合は、同じモジュールにある必要があります。それ以外の場合は、スパゲッティを書いています。

1 つのファイルがいくつかの関数をカプセル化するようにコードを構成したい場合は、それをモジュールにして、「モジュールを使用」してそれを含めます。

于 2012-06-24T02:10:53.220 に答える
0

いいえ、.perl スクリプトに引数を渡すことはできませんdo

于 2012-06-24T02:16:00.147 に答える