我有一個預期解析以下Perl腳本:如何檢測無效選項值
PROG -t XYZ -p 「AB」 -cm xyz.cmd -CO xyz.config
但我希望它錯誤時,我進入
PROG -t XYZ -PAB -cm xyz.cmd -CO xyz.config
(因爲-p其次是A和b不帶引號)。我使用Getopt :: Long來處理cmd行參數。我如何捕捉上述情況並發現錯誤?
謝謝!
我有一個預期解析以下Perl腳本:如何檢測無效選項值
PROG -t XYZ -p 「AB」 -cm xyz.cmd -CO xyz.config
但我希望它錯誤時,我進入
PROG -t XYZ -PAB -cm xyz.cmd -CO xyz.config
(因爲-p其次是A和b不帶引號)。我使用Getopt :: Long來處理cmd行參數。我如何捕捉上述情況並發現錯誤?
謝謝!
你可以簡單地檢查你是否有非選擇。
use Getopt::Long qw();
my ($opt_t, $opt_p, $opt_cm, $opt_co);
sub parse_args {
Getopt::Long::Configure(qw(posix_default));
($opt_t, $opt_p, $opt_cm, $opt_co) =();
Getopt::Long::GetOptions(
'h|help|?' => \&help,
't=s' => \$opt_t,
'p=s' => \$opt_p,
'cm=s' => \$opt_cm,
'co=s' => \$opt_co,
)
or usage();
@ARGV == 0
or usage("Too many arguments.");
}
{
parse_args();
...
}
輸出(使用usage
下面提供):
$ ./prog -t xyz -p a b -cm xyz.cmd -co xyz.config
Too many arguments.
Try `prog --help' for more information.
順便說一句,有些建議的help
和usage
實施:
use File::Basename qw(basename);
sub help {
my $prog = basename($0);
print("$prog [options]\n");
print("$prog --help\n");
print("\n");
print("Options:\n");
...
exit(0);
}
sub usage {
my $prog = basename($0);
if (my ($msg) = @_) {
chomp($msg);
warn("$msg\n");
}
warn("Try `$prog --help' for more information.\n");
exit(1);
}
在你的第二個使用情況下,'b'將被視爲常規命令行參數,並將保留在@ARGV中',那麼只需檢查'@ ARGV'是否只有一個元素? – mob
如果'a'或'b'預計不是字符串,那麼你可以使用這個事實,需要'-p'的整數(或浮點數)輸入。除此之外,在'Getopt :: Long'完成後,'@ ARGV'中會有一個鬆散的'b',您可以檢查它。或者只是解析並檢查'-p'輸入。 – zdim