我已经阅读了文档,GetOptions但我似乎找不到我需要的东西......(也许我是盲人)
我想要做的是像这样解析命令行
myperlscript.pl -mode [sth] [inputfile]
Run Code Online (Sandbox Code Playgroud)
我可以使用该-mode部分,但我不知道如何获得[inputfile].任何建议将被认真考虑.
您不用GetOptions于此任务.GetOptions将简单地为您解析选项,并留下不是一个选项的所有内容@ARGV.所以在调用之后GetOptions只需查看@ARGV命令行上传递的任何文件名.
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)
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,然后它会调用parse与file1作为参数.然后,它会调用parse与file2作为参数.然后,它会改变$opt{mode}到t,并呼吁parse有file3,作为一个参数.