博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Perl Getopt and GetOptions
阅读量:5840 次
发布时间:2019-06-18

本文共 4600 字,大约阅读时间需要 15 分钟。

官方资料:,以下转载自:

正文:

&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 -w

usestrict;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=string
or
test.pl –tag string

 

多参数值的参数

GetOptions ("library=s" => \@libfiles);

参数传到 @tag
or
GetOptions ("library=s@" => \$libfiles);
参数传到 @$tag
example:
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);
or
GetOptions ("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 AAA

name 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 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的出现使得利用最少的设置就可以处理复杂的选项。

转载于:https://www.cnblogs.com/zhangzzy/archive/2013/02/15/2913054.html

你可能感兴趣的文章
C++ primer plus
查看>>
python mysqlDB
查看>>
UVALive 3942 Remember the Word Tire+DP
查看>>
从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~目录...
查看>>
被需求搞的一塌糊涂,怎么办?
查看>>
c_数据结构_队的实现
查看>>
jquery 选择器总结
查看>>
Qt设置背景图片
查看>>
【阿里云文档】常用文档整理
查看>>
java中的Volatile关键字
查看>>
前端自定义图标
查看>>
实验二
查看>>
独立开发一个云(PaaS)的核心要素, Go, Go, Go!!!
查看>>
网站文章如何能自动判定是抄袭?一种算法和实践架构剖析
查看>>
【OpenCV学习】滚动条
查看>>
ofo用科技引领行业进入4.0时代 用户粘性连续8个月远甩摩拜
查看>>
兰州青年志愿者“中西合璧”玩快闪 温暖旅客回家路
查看>>
计划10年建10万廉价屋 新西兰政府:比想象中难
查看>>
甘肃发首版《3D打印职业教育教材》:校企合作育专才
查看>>
为找好心人抚养孩子 浙江一离婚父亲将幼童丢弃公园
查看>>