设为首页 收藏本站
查看: 830|回复: 0

[经验分享] Perl Getopt and GetOptions

[复制链接]

尚未签到

发表于 2015-12-26 10:10:08 | 显示全部楼层 |阅读模式
  官方资料:http://perldoc.perl.org/Getopt/Long.html,以下转载自:http://hi.baidu.com/juliehust/blog/item/386388f4e816d17fdcc4742a.html
  正文:
  &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;
  输出如下:
  [iyunv@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的出现使得利用最少的设置就可以处理复杂的选项。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156454-1-1.html 上篇帖子: c++中嵌入perl,python 下篇帖子: PERL的文件操作符 glob
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表