2011-11-18 37 views
0

我的程序如下:无法限制参数的数目在与Getopt的一个GetOptions选择::龙

use strict; 
    use warnings; 

    use Getopt::Long; 

    my @letters; 
    my @words; 

    GetOptions(
     "letters=s{2}" => \@letters, 
     "words=s{,}" => \@words 
    ); 

    print "Letters: " . join(", ", @letters) . "\n"; 
    print "Words: " . join(", ", @words) . "\n"; 

当我运行这个程序,我得到的输出如下:

perl getopts.pl --letters a --words he she it 
    Letters: a, --words 
    Words: 

--words作为--letters参数本身的一部分被读取。我期望GetOptions在这种情况下抛出错误消息。如何完成这件事。

回答

6

变化:

"letters=s{2}" => \@letters, 

到:

"letters=s{1,2}" => \@letters, 

...允许1到2个字母作为参数。

+0

“1对2个字母”应该是“1对2个字”?呃,我想你的意思是1-2“--letters”的论点。混淆词和字母也是争论的名称。 –

+0

我想要的只是两个参数,否则会出错。即使我尝试使用“letters = s {2,2}”=> \ @letters没有帮助 –

+1

如果您只需要两个参数,我会更改为“letters = s {,}”=> \ @letters,而外部GetOptions死亡或警告,除非@字母== 2 – JRFerguson

2

'{2}'的量词表示“正好两个”。所以,它甚至忽略了第二个参数,之后是开关。

的getopt的::你可能把这个从长文本:

GetOptions('coordinates=f{2}' => \@coor, 'rgbcolor=i{3}' => \@color); 

是其对和黑社会意义的特定条件。您需要一个x和一个坐标,或者您需要RGB规格的每个部分的值。只是你期望的方式'cmykcolor={4}'

如果您至少需要一个开关,则可以指定'{1,}'作为量词,如果您要“最多两个”,则'{1,2}'有意义。有趣的是,'{,2}'的行为与'{1,2}'完全相同。看来只要你指定一个量词,它就会吸一个参数而不管是否是下一个参数是一个开关。

因此,Getopt::Long中的量词看起来与正则表达式看起来相同,但它们表示不同的意思。