Perl Getopt :: Long - 仅对已定义的参数使用子参数

时间:2018-03-20 22:11:27

标签: perl getopt-long

我希望--import参数有一个"子参数"这只适用于此参数,而不是其他任何地方。例如:

app.pl --import --fresh

输出:命令工作

app.pl --export

输出:命令工作

app.pl --export --fresh

输出:未找到命令

这可以通过GetOpt :: Long来实现吗?请指导一下。

3 个答案:

答案 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作为单词,不带破折号。