Getopt::长、可选参数和贪婪

问题描述 投票:0回答:1

我正在尝试编写一个程序,其中有一个选项需要 可选参数,以这样的方式接受相同的选项 时尚与 perl -i

git --color
完全相同
相同的行为。很遗憾
Getopt::Long
完全那样工作,我无法做到。请允许我解释一下。

示例 #1:如果您运行

perl -i .bak
,它不会使用
.bak
作为备份文件 用于就地编辑的扩展,就像
perl -i.bak
那样。

示例 #2:如果您运行

git diff --color always
,它不会指定
always
--color
选项;为此,您必须使用
--color=always

我称之为“非贪婪”。

我不知道如何配置

Getopt::Long
来处理这个问题 场景类似。使用它的程序在这方面表现得“贪婪”。

考虑以下程序:

#!/usr/bin/env perl
use warnings;
use strict;
use Getopt::Long;

our $color;
our $backup;
Getopt::Long::Configure(qw(no_bundling));
Getopt::Long::GetOptions(
    "color:s" => \$color,
    "i:s" => \$backup,
) or die(":-(\n");

printf("\$color = '%s'\n", $color // '(undef)');
printf("\$backup = '%s'\n", $backup // '(undef)');
printf("\@ARGV = '%s'\n", join(', ', @ARGV));

以及以下调用,例如:

./foo.pl -i .bak --color always

期望的行为:

$ perl ./foo.pl -i .bak --color always meow moo
$color = ''
$backup = ''
@ARGV = .bak, always, meow, moo

实际行为:

$ perl ./foo.pl -i .bak --color always meow moo
$color = 'always'
$backup = '.bak'
@ARGV = meow, moo
perl arguments option-type getopt
1个回答
0
投票

作为解决方法,您可以使用选项终止符

--

./foo.pl -i .bak --color -- always meow moo
© www.soinside.com 2019 - 2024. All rights reserved.