我正在尝试使用 perl App::Cmd模块,一个简单的测试程序可以正常工作。
但是,如果我使用未在 opt_spec 函数(我正在调用的子命令)中配置的 --option 运行程序,它不会抱怨无效选项。我希望它会这样做。相反,它只是悄悄地忽略了该选项。
我无论如何都看不到配置 App::Cmd 来抱怨无效选项。
这是可能的,还是每个子命令都应该自己进行检查?
谢谢
根据 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