我正在尝试使用perl App::Cmd模块,并且一个简单的测试程序可以正常工作。
但是,如果我使用--option运行程序,我没有在opt_spec中配置 函数(我正在调用的子命令),它不会抱怨无效选项。我希望它能这样做。相反,它只是默默地忽略了这个选择。
我无法看到配置App :: Cmd来抱怨无效选项。
这是可能的,还是每个子命令都要进行自我检查?
由于
答案 0 :(得分: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 或 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