无法使用Getopt :: Long中的GetOptions限制选项的参数数量

时间:2011-11-18 13:59:57

标签: perl arguments

我的计划如下:

   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在这种情况下抛出错误消息。如何完成这项工作。

2 个答案:

答案 0 :(得分:6)

变化:

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

为:

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

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

答案 1 :(得分:2)

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

您可能从以下文件中获取的GetOpt :: Long文本:

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

对和三元组的特定条件是否有意义。您需要 x y 坐标,或者您想要RGB规范的每个部分的值。就像你期望的那样'cmykcolor={4}'

如果你想要至少一个,直到下一个开关,你可以指定'{1,}'作为量词,如果你想要“最多两个”,那么'{1,2}'是有道理的。有趣的是,'{,2}'的行为与'{1,2}'完全相同。似乎只要你指定一个量词,它就会再吸一个参数,无论下一个参数是否是一个开关。

因此Getopt::Long中的量词可能看起来与正则表达式相同,但它们意味着不同的东西。