使用Getopt::Long来处理复杂的命令行选项

 

Perl提供了各种方式来处理命令行选项。对于简单的程序来说,Getopt::Std或者甚至手写的代码测试都足够了。但是对于处理更加复杂的情况,就要考虑使用Getopt::Long了。

下面的例子显示了Getopt::Long的基本用法。(要获得完整的描述,见该模块的文档。)

use Getopt::Long;

# declare default values for variables
$verbose = 0;
$all = 0;
$more = -1;    # so we can detect both -more and -nomore
$diam = 3.1415;
@libs = ();
%flags = ();
$debug = -1;   # test for -debug with no argument (0)

# process options from command line
# verbose will be incremented each time it appears
# either all, everything or universe will set $all to 1
# more can be negated (-nomore)
# diameter expects a floating point argument
# lib expects a string and can be repeated (pushing onto @libs)
# flag expects a key=value pair and can be repeated
# debug will optionally accept an integer (or 0 by default)


GetOptions(     'verbose+' => /$verbose,
         'all|everything|universe'  => /$all,
         'more!' => /$more,
        'diameter=f' => /$diam,
        'lib=s' => /@libs,
        'flag=s' => /%flags,
        'debug:i' => /$debug);

# display resulting values of variables
print <<EOS;
Verbose:          $verbose
All:             $all
More:               $more
Diameter:         $diam
Debug:             $debug
Libs:                @{[ join ', ', @libs ]}
Flags:              @{[ join "/n/t/t", map { "$_ = $flags{$_}" } keys %flags ]}

Remaining:      @{[ join ', ', @ARGV ]}
  (ARGV contents)
EOS

基本的句法是传递一个选项分类符的散列。每个选项分类符都包含有用来匹配的文本,以及用来设置的对变量的参照。这个文本可以包括一个可选的or(垂直通道)别名分隔列表。

后面接有+的选项不接收自变量;但是,它会在每次出现的时候增加一个变量。后面接有!的选项不接收自变量;但是,它可以通过在前面加上no变成负的(例如,“more”选项的-nomore)。如果选项出现在命令行里,那么相关的变量被设置为1;如果负的选项出现了,那么相关的变量就被设置为0。

后面接有=的字符串要求接字符串(s)、整数(i),或者浮点(f)等类型的自变量。后面接有:的选项会接受缺省为0或者为空字符串的可选自变量。

如果相关联的变量是一个数组,那么选项可以多次出现,而值可以被推到数组里。如果变量是一个散列,那么就要求一个键=值(key=value)对,并被插入到散列里。

在匹配选项名的时候,GetOptions在缺省设置下会忽略大小写,并允许选项被简写为唯一的最短字符串(例如,-m代表-more,但是-di和-de被要求只能分别代表直径和调试)。

下面是一个命令行和输出结果的例子:

perl getoptlong.pl -l abc -l def -f a=b -f b=c -ev -de 5 -nomore arg

Verbose:        0
All:                 1
More:             0
Diameter:      3.1415
Debug:          5
Libs:              abc, def
Flags:            a = b
                      b = c

Remaining:      arg
  (ARGV contents)

Perl为处理命令行自变量提供了丰富的工具。而Getopt::Long的出现使得利用最少的设置就可以处理复杂的选项。

 

*********************************************************************

转自http://www.builder.com.cn/developer/code/story/0,3800066897,39190451,00.htm

*********************************************************************

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值