3

miscいくつかのスクリプトで使用されるモジュールがあります。各スクリプトは、2 つの標準オプション (-helpおよび-verbose) と独自のオプションを受け入れます。

したがって、すべてのスクリプトには

my ($verbose,$quiet) = (1,0);
my $help = undef;
...
GetOptions("verbose|v+" => \$verbose, "quiet|q+" => \$quiet, "help|h" => \$help,
           ....)
  or die "GetOptions: error (see above)\n";
if (defined $help) { usage(); exit; }
$verbose -= $quiet;

これはすでに退屈です。

miscここで、関数に の値も認識させたいので、 et al をスクリプト$verboseに移動して使用する必要があります。$verbosemisc$misc::verbose

その他:

our $verbose = 1;
my $quiet = 0;
our $help = undef;
our %common_options = ("verbose|v+" => \$verbose, "quiet|q+" => \$quiet, "help|h" => \$help);
sub set_verbose () { $verbose -= $quiet; }

脚本:

GetOptions(\%misc::common_options,"verbose|v","quiet|q","help|h",
           "count=i" => \$count, "start=i" => \$start, "mincoverage=i" => \$mincoverage,
           "output=s" => \$output, "input=s" => \$input, "targets=s" => \$targets)
  or die "GetOptions: error (see above)\n";
if (defined $misc::help) { usage(); exit; }
misc::set_verbose();

これはあまり良くありません (とにかく動作しないように見えますが、少なくとも-help無視されます)。

では、モジュールとスクリプトの間で共有されるコマンド ライン オプションには、何を使用するのでしょうか?

4

2 に答える 2

1

個人的に、私はそれをより簡単にします:

  • ハッシュを使用してコマンドラインオプションを保存する

      GetOptions(\%args, "xxx1","xxx2");
    
  • そのハッシュを(そのままで)任意のクラスのコンストラクターまたはモジュールセッターに渡します

      my $object = Class1->new(%args, %constructor_args);
      Module2::set_args(\%args); # 
    
  • モジュールの引数セッターは次のようになります。

      # Module2
      our %args;
      sub set_args { %args = %{ shift }; }
    

これにより、次のことが保証されます。

  • スコープ間でパラメーターを移動したり、一部の呼び出しを変更したりする必要はありません。それらはすべて必要な場所の約100%を通過します

  • きちんとした、乱雑でないコード。放送しているので、加入者の個人的なニーズを気にする必要はありません。

  • パターンは、所有するすべてのクラスに簡単に複製できます。

実際のところ、さらに巧妙になりたい場合Module2::set_args(\%args);は、いくつかのクラスの呼び出しを次のようなスマートコードに置き換えることもできます。

  1. ロードされたモジュールのリストを読み込みます

  2. これらのモジュールのどれがset_args()呼び出しを実装しているかを確認しますUNIVERSAL::can()

  3. サポートするモジュールの set_args()呼び出しを呼び出します

後者は、set_args()非クラスモジュールごとに1つへのN回の呼び出しがすべて、1回のset_all_modules_args()呼び出しに置き換えられるという点で、コードをさらにクリーンにします。

于 2012-07-31T22:15:30.447 に答える
0

標準オプションの取得を担当するモジュールを用意します。

このモジュールを使用すると、誰もが verbose() 呼び出しにアクセスできるようになります。

package StandardOptions;


use base qw(Exporter);
our @EXPORT = qw(verbose);

use Getopt::Long;

Getopt::Long::Configure(qw(pass_through));


my $helpNeeded;
my $verbose
GetOptions ("help" => \$helpNeeded, "verbose" => $verbose);


if ($helpNeeded) {
    #provide help
    exit(0);
}

sub verbose {
   return $verbose;
}

1;
于 2012-08-01T18:48:11.660 に答える