2

我正在尝试使用 perl App::Cmd模块,一个简单的测试程序可以正常工作。

但是,如果我使用未在 opt_spec 函数(我正在调用的子命令)中配置的 --option 运行程序,它不会抱怨无效选项。我希望它会这样做。相反,它只是悄悄地忽略了该选项。

我无论如何都看不到配置 App::Cmd 来抱怨无效选项。

这是可能的,还是每个子命令都应该自己进行检查?

谢谢

4

1 回答 1

1

根据 App::Cmd 教程https://metacpan.org/dist/App-Cmd/view/lib/App/Cmd/Tutorial.pod 参数由 Getopt::Long::Descriptive (GLD) 处理(检查参数和选项部分https://metacpan.org/dist/App-Cmd/view/lib/App/Cmd/Tutorial.pod#Arguments-and-Options

例如,jobstatus 是一个命令需要作业 id 作为参数

mycli jobstatus -j 1111 or mycli jobstatus --jobid 1111 #有效的命令选项

sub opt_spec {
  # check https://metacpan.org/pod/Getopt::Long#Summary-of-Option-Specifications
  return (
    [ "jobid|j=i",  "specify job id" ],
  );
}

sub validate_args {
  my ($self, $opt, $args) = @_;
  # The $opt object will be a dynamically-generated subclass of Getopt::Long::Descriptive::Opts. In brief, each of the options in @opt_spec becomes an accessor method on the object, using the first-given name, with dashes converted to underscores.
  # So object $opt->jobid parameter value is 1111 (jobid 1111 consider as option) and -k consider as argument
  $self->usage_error("Please verify given arguments @$args \n") if @$args;
}

输出

> perl mycli jobstatus -j 1111 -k
> Error: Please verify given arguments -k

Usage: mycli <command> [-?h] [long options...]
        -? -h --help  show help

mycli jobstatus [-j] [long options...]
        -j INT --jobid INT  specify job id
于 2021-08-11T12:51:26.030 回答