0
  • 私の環境の5つの異なる状態の検証スクリプトである5つのPerlファイルがあります。

    それぞれに少なくとも2つのサブルーチンがあります。

  • これまで、州の数は5つに制限されており、これらは正常に機能していました。しかし今、私は環境の状態がさらに20あり、現在の設計によれば、Perlスクリプトがさらに20あります。

  • 5つのスクリプトすべてを、状態を引数として取り、5つの異なる状態に対して5つの異なるサブルーチンを持つ1つのスクリプトに移動したいと思います。

    このように、さらに別の状態の検証を追加する必要がある場合は、まったく新しいPerlスクリプトではなく、新しいサブルーチンを定義するだけで済みます。

  • 問題は、ネストされたサブルーチン(問題が発生することが知られている)を使用すること、またはサブルーチン自体を展開することを意味することです。

例えば、

オリジナルのスクリプト

$ cat verify1.pl
sub a1 {
    ...
}
sub b1 {
    ...
}
a1(); b1(); a1();
$ cat verify2.pl
sub a2 {
    ...
}
sub b2 {
    ...
}
sub c2 {
    ...
}
a2(); b2(); c2(); a2();
$

統合されたスクリプト

$ cat verify.pl
sub one {
    ...
}
sub two {
    ...
}
my ($arg) = @ARGV;
if ($arg == 1) {
    one();  # should do what verify1.pl did
}
elsif ($arg == 2) {
    two();  # should do what verify2.pl did
}
$

これを解決するにはどうすればよいですか?

4

3 に答える 3

6
sub one {
    do 'verify1.pl';
}
sub two {
    do 'verify2.pl';
}

ただし、長期的には、スクリプトをモジュールに変換して、複雑さを最新かつ適切な方法で管理することをお勧めします。

于 2010-10-01T10:03:39.527 に答える
2

サブルーチンは通常どおりに配置できます。

sub a1 {
    ...
}
sub b1 {
    ...
}
sub a2 {
    ...
}
sub b2 {
    ...
}
sub c2 {
    ...
}
sub one {
    a1(); b1(); a1();
}
sub two {
    a2(); b2(); c2(); a2();
}
my ($arg) = @ARGV;
if ($arg == 1) {
    one();  # should do what verify1.pl did
}
elsif ($arg == 2) {
    two();  # should do what verify2.pl did
}
于 2010-10-01T10:00:43.230 に答える
1

すべてのサブルーチンを1つのファイルに入れ、競合するものの名​​前を変更するだけで、これを解決できます。

ただし、問題は、発生する可能性のあるすべての検証状況をハードコーディングしていることのようです。より良い方法は、検証パイプラインを動的に構築できるプロセスを考え出すことです。何が必要かわからないので、Data::Constraintやその他の検証モジュールのようなものがあなたに適しているかどうかはわかりません。質問の情報がほとんどない状態で、有用なアドバイスを提供することは非常に困難です。

于 2010-10-01T17:23:54.197 に答える