0

Perlスクリプトで「do」を使用し、複数のサブルーチン定義を避ける方法は?

別の Perl スクリプトから Perl スクリプトを呼び出そうとしています。私がこれを達成している方法は次のとおりです。

 local @ARGV = (
   $arg1,
   $arg2
 );
 do 'perl_script.pl';

「system()」を使用する代わりに「do」を使用している理由は、この古いコードベースでは、複数の Perl スクリプトを呼び出す必要があるためです (もちろん、すべてを Perl モジュールにリファクタリングできますが、そうではありません)この時点で価値があります)。

「system()」の代わりに「do」を使用すると、「-d」フラグを使用したデバッグが容易になり、不要なシステム コールを回避できます。私が直面している問題は、Perl スクリプトにはサブルーチンが定義されているため、同じ perl スクリプトを複数回呼び出すと「do」が失敗し、スクリプトを複数回呼び出すと「subroutine redefined」エラーが発生することです。

「do」または再定義されたサブルーチンを無視する方法以外に、これを行う別の方法はありますか?

4

2 に答える 2

2

これが見苦しい設定であることはご存じのように思われるので、ここでは詳しく説明しません。実行中のブロックでスコープ付きの警告なしを使用できます。

{
    no warnings 'redefine';
    local @ARGV = (
       $arg1,
       $arg2
    );
    do 'perl_script.pl';
}
于 2013-08-19T15:37:53.043 に答える
0

呼び出しているファイルの編集に問題がない場合は、スクリプトごとに異なる名前空間を定義することで、やや汚れた簡単な解決策が得られます。

package script1; # From this point, the current namespace is script1
use warnings;
use strict;

... # some code

sub some_sub {
    ...
}

そうすれば、別のスクリプトが を定義する場合some_sub、別の名前空間にあるため、再定義されたとは見なされません。これにより、スクリプトが残りのスクリプトの実行を、予期しない結果を引き起こす可能性のあるグローバル変数またはその他の定義で汚染することを防ぐこともできます。

繰り返しますが、これは最適または優れたプラクティスとはほど遠いものです (名前空間を定義するという事実ではなく、組織化されたスキームで再利用できるコードを複製する可能性があるため、物事をすばやく分離するために任意に定義することです)。これは、これをすばやく機能させるのに役立つアイデアにすぎません。

HTH

于 2014-06-09T18:50:48.503 に答える