具有特殊字符选项的Getopt :: Long(例如 - %)

时间:2014-12-25 07:31:35

标签: perl optional-parameters

在perl脚本中,我在调用脚本时使用Getopt::Long来解析命令行选项。

现在,我想添加一个选项-%

die unless GetOptions (
    'x=i' => \my $x,
    'y:i' => \my $y,
    'z'   => \my $z,
    '%'   => \my $percent
);

然而,这导致Error in option spec: "%"。我当然可以使用'pct' => \my $percent代替'%' => \my $percent,但我觉得-%的助记符值更高。

那么,Getopt::Long以某种方式,我想要的可能吗?或者是否有其他选项解析器模块可以执行我想要的操作?

3 个答案:

答案 0 :(得分:3)

我强烈建议不要使用-%作为选项...通常的做法是使用62个可用的单个字符或更详细的长选项中的任何一个。

无论如何-%意味着什么?它或多或少是一种' 单位'其中需要处理另一个参数选项

draw_rect .... --opacity 0.75 # for a range between 0 .. 1.000
draw_rect .... --opacity 75 % # for a range between 0 .. 100.0

calculate_new_prices --discount 3.50 USD # for $3,50 less ?
calculate_new_prices --discount 3.50 EUR # for €3,50 less ?
calculate_new_prices --discount 3.50     # for  3,50 discount in  .... ?
calculate_new_prices --discount 35.0 %   # for 35.00 % offers ?

Getopt :: Long知道如何处理具有多个值的选项,只需将其传递给ArrayRef:

GetOptions (
  ...
  'discount{1,2} => \@discount,
  ...
);

如果它真的是一个'开关'然后它可能意味着某些东西是“相对的”。别的,只需使用更详细的选项,说明......" 它的相对"而不是" 这是一个百分号 - " ....

my_script ....  --relative

圣诞快乐

答案 1 :(得分:2)

解决方法可能是使用ARGV代替%替换p的简单预处理:

use strict;
use warnings;
use Getopt::Long;

my $substitute_for_percent = 'p';
$_ =~ s/^-%/-$substitute_for_percent/ for (@ARGV);

GetOptions (
    'z'   => \my $z,
     $substitute_for_percent   => \my $percent
) or die;

答案 2 :(得分:0)

Getopt::Long版本2.39开始,字符可能是别名,但这些字符不能出现在Perl标识符中,所以这是可能的:

use warnings;
use strict;

use Getopt::Long;

my $percent = 100;

die unless GetOptions (
    'percent|%=f' => \$percent
);

print "\n  $percent%\n\n";

然后调用它

$ perl script.pl -% 5.4