具有多个值的命令行参数

时间:2012-05-11 20:02:49

标签: perl command-line arguments

我正在做一个perl脚本,我需要从命令行中获取多个值。例如:

perl script.pl --arg1 op1 op2 op3

我正在使用Getopt :: Long,我可以使用它:

perl script.pl --arg1 op1 --arg1 op2 --arg1 op3

但我真的需要(想要)第一个选项。

我检查了他们的文档,这应该做我想要的:

GetOptions('arg1=s{3}' => \@myArray);

http://search.cpan.org/~jv/Getopt-Long-2.38/lib/Getopt/Long.pm#Options_with_multiple_values

但是我收到了这个错误:

  选项规范中的

错误:“arg1 = f {3}”

任何想法/解决方案?

4 个答案:

答案 0 :(得分:4)

您的代码适用于我,但看起来该功能最近才添加到Getopt :: Long(版本2.35),因此您可能拥有旧版本的Getopt :: Long。运行

perl -MGetopt::Long -le'print $Getopt::Long::VERSION;'

查看您的版本。

答案 1 :(得分:4)

我认为你的问题可能是f{3}f用于 float 参数(实数)。 如果您将字符串作为参数,则应使用s说明符。关于论点的数量,文档说:

  

也可以指定选项所需的最小和最大参数数。 foo = s {2,4}表示一个至少包含两个且最多四个参数的选项。 foo = s {,}表示一个或多个值; foo:s {,}表示零个或多个选项值。

考虑来自文档的hise note并根据您的需要进行调整。

答案 2 :(得分:2)

我不确定为什么人们没有提供这个解决方案,但是这篇文章太旧了,现在可能为时已晚,无法提供帮助。

我找不到自动方法。

您需要做的是引用多个参数并在代码中解析它们:

perl myscript.pl -m 'a b c'

然后在代码中拆分-m参数值并从那里做必要的事情。

答案 3 :(得分:0)

getoptions function perl multi value not working类似的问题,我想......无论如何,似乎只使用"optlist=s" => \@list,对我有用,可以在数组中存储重复/重复选项;这是我的版本:

$ perl --version | grep This && perl -MGetopt::Long -le'print $Getopt::Long::VERSION;'
This is perl, v5.10.1 (*) built for i686-linux-gnu-thread-multi
2.38

示例(test.pl):

#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
my $numone = 0;
my $numtwo = 1;
my @list=();
my $result;
$result = GetOptions (
  "numone=i" => \$numone,
  "numtwo=i"   => \$numtwo,
  "optlist=s" => \@list,
);

printf("result: %d;\n", $result);
printf("numone: %d, numtwo %d, optlist:\n", $numone, $numtwo);

foreach my $tmplist (@list) {
  printf(" entry: '%s'\n", $tmplist);
}

测试输出:

$ perl test.pl --numone 10 --numtwo 20 --optlist testing --optlist more --optlist options
result: 1;
numone: 10, numtwo 20, optlist:
 entry: 'testing'
 entry: 'more'
 entry: 'options'