gpt4 book ai didi

perl - 模块和主脚本中使用的命令行选项

转载 作者:行者123 更新时间:2023-12-01 05:10:53 25 4
gpt4 key购买 nike

我有一个模块 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 值的函数也是,所以我要搬家 $verbose等到 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 被忽略了)。

那么,人们使用什么来在模块和脚本之间共享命令行选项呢?

最佳答案

就个人而言,我做得更简单:

  • 使用哈希存储命令行选项
      GetOptions(\%args, "xxx1","xxx2");
  • 将该哈希按原样传递给任何类的构造函数或模块 setter
      my $object = Class1->new(%args, %constructor_args);
    Module2::set_args(\%args); #
  • 模块中的参数 setter 将是:
      # Module2
    our %args;
    sub set_args { %args = %{ shift }; }

  • 这可确保:
  • 我永远不必担心将参数从一个范围移动到另一个范围并且必须修改一些调用。他们都通过了大约 100% 需要的地方
  • 整洁而不困惑的代码。由于我们是广播,我们不需要担心订阅者的个人需求。
  • 模式很容易复制到您拥有的所有类。

  • 事实上,如果你想更加狡猾,你甚至可以替换 Module2::set_args(\%args);使用以下智能代码调用多个类:
  • 读取已加载模块列表
  • 检查哪些模块实现了set_args()调用UNIVERSAL::can()
  • 调用支持模块的set_args()调用

  • 后者使代码更加简洁,因为 N 调用了 set_args()每个非类模块一个都被一个 set_all_modules_args() 替换称呼。

    关于perl - 模块和主脚本中使用的命令行选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11748835/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com