处理命令行选项是一个很重复的事情,Getopt::Long 把这个过程简单化了。使用这个模块其实只要知道一些常用的用法就行了。
这是文档中的例子:
use Getopt::Long;
my $data = "file.dat";
my $length = 24;
my $verbose;
$result = GetOptions ("length=i" => \$length, # numeric
"file=s" => \$data, # string
"verbose" => \$verbose); # flag
观察一下 GetOptions 函数的参数,可以发现,大致可以把设置分为三个部分: (1)命令行的选项,对应于“length”,“file”,”verbose”,这样在命令行就可以用 -length 或者 —length 甚至 -l(必须是唯一的) 触发选项了。可以通过使用“|”来设置别名。(2)选项类型,后面接有=的字符串要求接字符串(s)、 整数(i),或者浮点(f)等类型的自变量。后面接有:的选项会接受缺省为0或者为空字符串的可选自变量。(3)选项设置的变量。
对于不传递参数的选项,也就是一些开关类型,可以在第一部分后接“!”,这表示该选项不接收自变量,但是可以通过在前面加上no变成负的(例如,“more”选项的-nomore)。如果不是用“!”,而是“+”,这表示它会在每次出现的时候增加一个变量。如果选项出现在命令行里,那么相关的变量被设置为1;如果负的选项出现了,那么相关的变量就被设置为0。
下面的例子来自 http://www.zdnet.com.cn/developer/code/story/0,3800066897,39190451,00.htm
下面的例子显示了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 " ", 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.cnblogs.com/starspace/archive/2008/11/07/1329020.html