我已经阅读了GetOptions
的文档,但我似乎找不到我需要的东西......(也许我是盲人)
我想要做的是像这样解析命令行
myperlscript.pl -mode [sth] [inputfile]
我可以使用-mode
部分,但我不知道如何获取[inputfile]。任何建议将被认真考虑。
答案 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
,不是吗?