2017-07-24 62 views
1

我有一個預期解析以下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行參數。我如何捕捉上述情況並發現錯誤?

謝謝!

+1

在你的第二個使用情況下,'b'將被視爲常規命令行參數,並將保留在@ARGV中',那麼只需檢查'@ ARGV'是否只有一個元素? – mob

+0

如果'a'或'b'預計不是字符串,那麼你可以使用這個事實,需要'-p'的整數(或浮點數)輸入。除此之外,在'Getopt :: Long'完成後,'@ ARGV'中會有一個鬆散的'b',您可以檢查它。或者只是解析並檢查'-p'輸入。 – zdim

回答

7

你可以簡單地檢查你是否有非選擇。

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. 

順便說一句,有些建議的helpusage實施:

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); 
} 
+0

@ysth我認爲'require_order'與這個問題無關。 – melpomene

+0

@melpomene,這不是必需的,儘管它停止解析它。我總是使用'posix_default'。 (爲什麼你希望你的新程序是非標準的?) – ikegami

+0

@ikegami因爲我的機器上沒有其他程序(GNU utils)遵循嚴格的POSIX規則。 – melpomene