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

rxi*_*xin 3 perl

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

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

myperlscript.pl -mode [sth] [inputfile]
Run Code Online (Sandbox Code Playgroud)

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

inn*_*naM 8

您不用GetOptions于此任务.GetOptions将简单地为您解析选项,并留下不是一个选项的所有内容@ARGV.所以在调用之后GetOptions只需查看@ARGV命令行上传递的任何文件名.


jam*_*san 6

GetOptions未处理的任何内容都会保留@ARGV.所以你可能会想要类似的东西

use Getopt::Long;
my %opt
my $inputfile = 'default';
GetOptions(\%opt, 'mode=s');
$inputfile = $ARGV[0] if defined $ARGV[0];
Run Code Online (Sandbox Code Playgroud)


Bra*_*ert 6

GetOptions将在@ARGV变量中留下它没有解析的任何参数.所以你可以循环遍历@ARGV变量.

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

for my $filename (@ARGV){
  parse( $filename, \%opt );
}
Run Code Online (Sandbox Code Playgroud)

还有另一种选择,您可以使用特殊<>参数回调选项.

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

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

perl test.pl -mode s file1 file2 -mode t file3
Run Code Online (Sandbox Code Playgroud)

这个例子将设置$opt{mode}s,然后它会调用parsefile1作为参数.然后,它会调用parsefile2作为参数.然后,它会改变$opt{mode}t,并呼吁parsefile3,作为一个参数.