官方资料:,以下转载自:
正文:
&GetOptions("p=s" => \$ParameterFile,
"s:s@" => \@Step, "notify!" => \$NotifyFlag, );$NotifyFlag=0 if (! defined $NotifyFlag);
我们在linux常常用到一个程序需要加入参数,现在了解一下perl中的有关控制参数的函数.getopt.在linux有的参数有二种形式.一种是–help,另一种是-h.也就是-和–的分别.–表示完整参数.-表示简化参数.
在perl中也分这二种.
Getopt::Std模块的功能: 初始化perl命令行中所接受的参数,简化了命令行参数的解析。
简化参数例子:
#!/usr/bin/perl -wusestrict;useGetopt::Std;
usevars qw($opt_a $opt_b $opt_c);getopts('d:f:p:'); print "\$opt_a =>; $opt_a\n" if $opt_a;print "\$opt_b =>; $opt_b\n" if $opt_b;print "\$opt_c =>; $opt_c\n" if $opt_c;输出如下:
[root@mail test]# ./getopt.pl -a aa -b bb -c cc
$opt_a =>; aa
$opt_b =>; bb $opt_c =>; cc
带值参数
※参数类型:整数, 浮点数, 字串GetOptions( ‘tag=s’ => \$tag );
'='表示此参数一定要有参数值, 若改用 ':'代替表示参数不一定要有参数值's’表示传递字串参数, 若为’i'表传递整数参数, 若为’f'表传递浮点数example:test.pl –tag=stringortest.pl –tag string
多参数值的参数
GetOptions ("library=s" => \@libfiles);
参数传到 @tagorGetOptions ("library=s@" => \$libfiles);参数传到 @$tagexample:test.pl –library lib/stdlib –library lib/extlib
参数别名
GetOptions (‘length|height=f’ => \$length);第一个名称为primary name, 其他的名称为alias(可有多个alias名称) 当使用hash参数时, 使用primary name作为key值参数的简称及大小写
GetOptions (‘length|height=f’ => \$length, "head" => \$head);若没有特别设定, Getopt会忽略参数的大小写, 也就是 -l or -L 指的都是同一个参数(–length)对于不传递参数的选项,也就是一些开关类型,可以在第一部分后接“!”,这表示该选项不接收自变量,但是可以 通过在前面加上no变成负的(例如,“more”选项的-nomore)。如果不是用“!”,而是“+”,这表示它会在每次出现的时候增加一个变量。如果 选项出现在命令行里,那么相关的变量被设置为1;如果负的选项出现了,那么相关的变量就被设置为0。
hash参数值(有名称及参数值)
GetOptions ("define=s" => \%defines);orGetOptions ("define=s%" => \$defines);example:test.pl –define os=linux –define vendor=redhat
完整参数:
#!/usr/bin/perl
useGetopt::Long;
Getopt::Long::GetOptions(
'page=i' => \$page, 'onoff!' => \$onoff, 'help' => \$wants_help, 'name=s' => \$name, 'number:i' => \$number); }if(defined($page)){ print "page flag set to $page "
}if(defined($onoff)){ print "onoff flag set to $onoff ";}if(defined($wants_help)){
print "help flag set to $wants_help ";}if(defined($name)){
print "name flag set to $name ";}if(defined($number)){
print "number flag set to $number ";}运行命令:
./getlong.pl -name AAAname flag set to AAA
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。
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 variablesprint <<EOS;Verbose: $verboseAll: $allMore: $moreDiameter: $diamDebug: $debugLibs: @{[ 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 argVerbose: 0All: 1More: 0Diameter: 3.1415Debug: 5Libs: abc, defFlags: a = b b = cRemaining: arg (ARGV contents)
Perl为处理命令行自变量提供了丰富的工具。而Getopt::Long的出现使得利用最少的设置就可以处理复杂的选项。