我希望--import参数有一个"子参数"这只适用于此参数,而不是其他任何地方。例如:
app.pl --import --fresh
输出:命令工作
app.pl --export
输出:命令工作
app.pl --export --fresh
输出:未找到命令
这可以通过GetOpt :: Long来实现吗?请指导一下。
答案 0 :(得分:3)
我认为如果不采用部分解析,最接近Getopt :: Long就可以了:
use strict;
use warnings;
use Data::Dumper;
use Getopt::Long;
GetOptions('export=s%{1,5}'=>\my %export, 'another_option=s'=>\my $ao);
print Dumper({ 'export'=> \%export, 'another_option'=>$ao});
perl t1.pl --export fresh=1 b=2 c=3 --another_option value
$VAR1 = {
'export' => {
'c' => '3',
'b' => '2',
'fresh' => '1'
},
'another_option' => 'value'
};
此处export=s%{1,5}
将--export fresh=1 b=2 c=3
解析为哈希%export
s%{1,5}
预计会有1到5个key=value
对
答案 1 :(得分:2)
选项确实需要一个参数。但是,该参数并未使用--
。
GetOptions(
'help' => \&help,
'import:s' => \$opt_import,
)
or usage();
defined($opt_import) && ( $opt_import eq '' || opt_import eq 'fresh' )
or usage("Invalid value for --import");
@ARGV == 0
or usage("Incorrect number of arguments");
# Convert into booleans for convenience.
$opt_fresh = defined($opt_import) && $opt_import eq 'fresh';
$opt_import = defined($opt_import);
以上内容接受以下内容:
app.pl --import fresh
app.pl --import
app.pl
请注意,使用=s
代替:s
会提供强制值。
示例助手:
use FIle::Basename qw( basename );
sub usage {
my $basename = basename($0);
print("usage: $basename [options]\n");
print(" $basename --help\n");
print("\n");
print("Options:\n");
print("\n");
print(" --import [fresh]\n");
exit(0);
}
sub usage {
if (@_) {
chomp( my $msg = shift );
warn("$msg\n");
}
my $basename = basename($0);
warn("Try '$basename --help' for more information.\n);
exit(1);
}
答案 2 :(得分:2)
我认为此调用的目的在于此处的实现,如下所示。
需要在$fresh
选项下设置一个标记(称为--import
),以及与--import
关联的其他标记。此外,可能还有一个独立选项--fresh
,用于设置$fresh
标记。
虽然Getopt::Long不支持嵌套选项,但可以使用其他工具实现。设置--import
以使用:
获取可选参数,并设置变量in a sub。如果提交单词fresh
作为值设置相应的($fresh
)标记。
use warnings;
use strict;
use feature 'say';
use Getopt::Long;
my ($import, $fresh);
GetOptions(
'import:s' => sub {
$import = 1;
$fresh = 1 if $_[1] eq 'fresh';
},
'fresh!' => \$fresh # if independent --fresh option is needed
);
say 'import: ', $import // 'not submitted'; #/
say 'fresh: ', $fresh // 'not submitted';
sub接收两个参数,即选项名称和值,该值用于检查是否传递了fresh
。它所代表的代码对于可以传递的其他单词没有任何作用,但是如果提交了除fresh
以外的任何值,则可以使其中止(使用用法消息)。
无论出于什么特殊原因,都需要在子服务器中对此进行编码。
如果确实提供了单独的--fresh
选项,则用户需要小心,因为可以为$fresh
提交有冲突的值 - 一个--import
,另一个--fresh
本身。这可以在代码中检查。
选项--import
仍然可以作为一个简单的标志。
有效的调用是
gol.pl --import # $import is 1 gol.pl --import fresh # $import is 1, $fresh is 1 gol.pl --fresh # $fresh is 1
由于fresh
在子集中设置为值--import
,因此无法使用任何其他选项进行设置。
这与要求不同,将fresh
作为单词,不带破折号。