如何使用GetOptions获取默认参数?

时间:2009-11-13 16:31:19

标签: perl

我已经阅读了GetOptions的文档,但我似乎找不到我需要的东西......(也许我是盲人)

我想要做的是像这样解析命令行

myperlscript.pl -mode [sth] [inputfile]

我可以使用-mode部分,但我不知道如何获取[inputfile]。任何建议将被认真考虑。

4 个答案:

答案 0 :(得分:8)

您不要将GetOptions用于此任务。 GetOptions将简单地为您解析选项,并将@ARGV中不可选的所有内容保留下来。因此,在调用GetOptions之后,只需查看@ARGV以获取在命令行上传递的任何文件名。

答案 1 :(得分:6)

GetOptions未处理的任何内容都保留在@ARGV中。所以你可能想要像

这样的东西
use Getopt::Long;
my %opt
my $inputfile = 'default';
GetOptions(\%opt, 'mode=s');
$inputfile = $ARGV[0] if defined $ARGV[0];

答案 2 :(得分:6)

GetOptions将在@ARGV变量中保留未解析的任何参数。所以你可以循环遍历@ARGV变量。

use Getopt::Long;
my %opt;
GetOptions(
  \%opt,
  'mode=s'
);

for my $filename (@ARGV){
  parse( $filename, \%opt );
}

还有另一个选项,您可以使用特殊的<>参数回调选项。

use Getopt::Long qw'permute';
our %opt;
GetOptions(
  \%opt,
  'mode=s',
  '<>' => sub{
    my($filename) = @_;
    parse( $filename, \%opt );
  }
);

如果您希望能够处理多个文件,但是对其中一些文件使用不同的选项,这将非常有用。

perl test.pl -mode s file1 file2 -mode t file3

此示例将$opt{mode}设置为s,然后以parse为参数调用file1。然后它会以parse作为参数调用file2。然后,它会将$opt{mode}更改为t,并以parse作为参数调用file3

答案 3 :(得分:3)

不以-开头的命令行参数仍然在@ARGV,不是吗?