3

我有一个misc由几个脚本使用的模块。每个脚本都接受两个标准选项 (-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函数也能意识到 的值$verbose,所以我必须将$verboseet al 移到misc$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()因为每个非类模块的 N 次调用都被一个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 回答