【问题标题】:Multiple command line arguments in perl when one argument mistakenly takes other argument as its value当一个参数错误地将另一个参数作为其值时,perl 中的多个命令行参数
【发布时间】:2016-03-04 20:03:53
【问题描述】:

我正在开发一个 perl 程序(perl 5.8)。该程序使用命令行参数作为其输入。 我面临的问题是 - 我正在使用多个命令行参数。 例如

tool -f "arg1_val" -p "arg2_val"

但在用户忘记指定值的情况下说

tool -f -p "arg2_val"

它假设-f = -p

,而不是出错

我正在使用Getopt::Long 和例程 GetOptions

GetOptions ("f=s" => \$opt_f,
            "p=s" => \$opt_p,
           );

【问题讨论】:

标签: perl


【解决方案1】:

您应该使用: 而不是=

您应该查看Getopt::Long 中的“选项规格摘要”。这是来自GetOptions

=s:选项采用强制字符串参数。该字符串将分配给选项变量。请注意,即使字符串参数 以 - 或 -- 开头,它本身不会被视为一个选项。

:s: 选项接受一个可选的字符串参数。这个字符串将是 分配给选项变量。如果省略,它将被分配“” (一个空字符串)。如果字符串参数以 - 或 -- 开头,它将 被认为是一种选择。

下面应该工作。如果省略任何参数,则将分配相应的变量""

GetOptions ('f:s' => \$opt_f,
            'p:s' => \$opt_p,
           ) or die("Error in command line arguments\n");

# later you can check for argument variable if any option is mendatory for you.
die "No value passed to -f\n" unless($opt_f);

【讨论】:

  • 这就解决了。我完全忘记了区别。
  • 感谢您让我知道其中的区别。在大多数文档中,=s 和 :s 之间的区别仅在可选/非可选方面进行了解释。但要记住的重要一点 - “即使字符串参数以 - 或 - 开头,它也不会被视为本身的选项”
【解决方案2】:

您预计会出现什么错误? -f 选项有一个参数,而 -p 选项没有指定。您必须自己处理强制性或额外选项:

die "Missing -p\n" unless defined $opt_p;
die "Missing -f\n" unless defined $opt_f;
die "Extra arguments @ARGV\n" if @ARGV;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2012-10-25
    • 2016-01-30
    相关资源
    最近更新 更多