我们在linux常常用到一个程序需要加入参数,现在了解一下 perl 中的有关控制参数的模块 Getopt::Long ,比直接使用 @ARGV 的数组强大多了.我想大家知道在 Linux 中有的参数有二种形式.

  • 长参数  –help
  • 短参数   -h

也就是-和–的分别.–表示完整参数.-表示简化参数.在 Perl 的这个模块中也支持这二种方法.
这要介绍的二 Getopt 其实有二个模块,一个叫 Getopt::Long 一个叫 Getopt::Std.下面就只介绍 Getopt::Long 了.因为这个模块更加强大

Getopt::Long 模块

初始化 Perl命令行中所接受的参数,简化了命令行参数的解析.下面看程序的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/perl
use strict;
use Getopt::Long;
use Smart::Comments;
 
my @libs    = ();
my %flags   = ();
my ( $verbose, $all, $more, $diam, $debug, $test, $step);
 
GetOptions(
        'verbose+'  => \$verbose,
        'more!'     => \$more,
        'debug:i'   => \$debug,
        'lib=s'     => \@libs,
        'flag=s'    => \%flags,
        'test|t'    => \$test,
        'all|everything|universe' => $all,
);
 
### $verbose
### $more
### $debug
### $test
### @libs;
### %flags

这就是使用的方法,下面是详细解释,注意看 GetOptions 中的 => 前面的部分.下面是详解

  • ‘verbose+’  接有 + 的选项不接收变量,后面不需要加内容.直接使用就行了,会在每次出现时增加一次变量,就是讲命行时在参数中 -verbose -verbose 出现二次时 verbose 的值就会变成 2.
  • ‘more!’        接有 ! 的选项不接收变量(也就是讲后面不需要加参数 –more 来使用就行了),只要命令行中出现了这个参数,就会默认是 1 ,是用来设置打开和关掉一个功能的>.可以在参数前加 no 变成负的例如-nomore.
  • ‘flag=s’        接有 = 的字符串要求接字符串(s)、整数(i),或者浮点(f)等类型的变量.
  • ‘debug:i’      接有 : 的选项会接受缺省为0或者为空字符串的可选变量                                                                                                                                                            可在GetOptions();之后,进行设置默认值 $debug ||= 5;
  • ‘test|t’          接有 | 的选项表示可以给 –test 简写为 -t.
  • ‘lib=s’     => @libs    如果相关联的变量是个数组, 如这个地方的 @libs, 那么选项可以多次出现, 值可以被推到数组里.
  • ‘flag=s’    => %flags  如果相关联的变量是个散列, 那么就要求一个键=值(key=value)对, 并被插入到散列里.

备注:
     在匹配参数名的时候,GetOptions 在缺省设置下会忽略大小写,默认参数被简写为唯一的最短字符串(首字母)(例如,-m 代表 -more. 相同的首字母时,会加上第二个字母来区分)

Getopt 模块的程序使用的方法:

根据上面的例子,比如我们写了一个程序叫 test.pl .我们只需要在命令行中加如下参数:

1
2
$ ./test.pl  --verbose --verbose -v --more \
      --lib='/lib' -l '/lib64' --f a=1 --flag b=2  --debug 2 -t fukai

有点小长,在看看上面的,就会明白意思了.在这个地方,我使用了 Smart::Comment 模块,所以在最下面的 ###  是会输出这个变量本身的内容的.这也是一个超级强大的模块.我们来看看输入这些参数后.会输出什么内容吧.

1
2
3
4
5
6
7
8
9
10
11
### $verbose: 3
### $more: 1
### $debug: 2
### @libs: [
###          '/lib',
###          '/lib64'
###        ]
### %flags: {
###           a => '1',
###           b => '2'
###         }

在对一下上面输入的参数,明白了吧.

Getopt 模块的简单总结

(1. 带值参数传入程序内部
※参数类型:整数, 浮点数, 字串

1
2
3
GetOptions(
    'tag=s' => \$tag
);

‘=’表示此参数一定要有参数值, 若改用’:’代替表示参数不一定要有参数值
‘s’表示传递字串参数, 若为’i’表传递整数参数, 若为’f’表传递浮点数.
带值参数使用的方法

1
2
$ test.pl --tag=string
$ test.pl --tag string

(2. 需要传送多个值的参数到程序中.
比如需要传几个值到 @libfiles 中的操作方法.

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

参数传到 @$tag
使用的方法

1
$ test.pl --library lib/stdlib --library lib/extlib

(3. 对键值对的参数传递
有时我们需要传送一些键值对到程序中进行处理,就需要使用到这个功能了.

1
2
GetOptions ("define=s" => \%defines);
GetOptions ("define=s%" => \$defines);

使用的方法

1
$ test.pl --define os=linux --define vendor=redhat

(4. 参数的别名
我们需要参数加个简写之类的别名时,可以使用下面的方法

1
GetOptions ('length|height=f' => \$length);

第一个名称为 primary name, 其他的名称为 alias(可有多个alias名称) ,当使用hash参数时, 使用primary name作为key值

参考:http://www.php-oa.com/2009/04/04/perl_getopt-long.html

略有修改或加入新东西

模块——Getopt::Long接收客户命令行参数和Smart::Comments输出获得的命令行参数内容的更多相关文章

  1. Python命令行参数解析模块getopt使用实例

    Python命令行参数解析模块getopt使用实例 这篇文章主要介绍了Python命令行参数解析模块getopt使用实例,本文讲解了使用语法格式.短选项参数实例.长选项参数实例等内容,需要的朋友可以参 ...

  2. getopt两个模块getopt 和gun_getopt 的异同

    getopt的两个模块getopt和gun_getopt都可以接收参数,但是又有不同; 先看 getopt.getopt这个模块: import sys import getopt def main( ...

  3. Python 命令行之旅:使用 argparse 实现 git 命令

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  4. Python 命令行之旅:深入 click 之子命令篇

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  5. 如何在命令长度受限的情况下成功get到webshell(函数参数受限突破、mysql的骚操作)

    0x01 问题提出 还记得上篇文章记一次拿webshell踩过的坑(如何用PHP编写一个不包含数字和字母的后门),我们讲到了一些PHP的一些如何巧妙地绕过数字和字母受限的技巧,今天我要给大家分享的是如 ...

  6. linux命令(47):Linux下对文件进行按行排序,去除重复行

    Linux下对文件进行按行排序:sort 与 uniq 命令简介 Linux | May 24, 2015 | linux sort 命令可针对文本文件的内容,以行为单位进行排序.其基本语法格式为: ...

  7. Linux命令-统计文件中的字节数、字数、行数:wc

    Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项]文件... 2.命令功能: 统计指定文件中的字节数. ...

  8. centos 目录结构 快捷键 ls命令,alias别名,so:动态库 a:静态库,环境变量PATH,Ctrl+z 暂停命令,Ctrl+a 光标到行首,Ctrl+e 光标到行尾,Ctrl+u 删除光标前所有字符 Ctrl+r 搜索命 hash命令 Ctrl+左箭头/右箭头 cd命令 第三节课

    centos 目录结构 快捷键 ls命令,alias别名,so:动态库 a:静态库,环境变量PATH,Ctrl+z 暂停命令,Ctrl+a 光标到行首,Ctrl+e 光标到行尾,Ctrl+u 删除光标 ...

  9. C#网络编程学习(4)---Socket Tcp进阶之 使用异步循环接收客户端连接和信息

    1.方法介绍 BeginAccept(AsyncCallback callback, object state); 异步开始监听客户端连接. callback为一个委托,在成功接收客户端连接时调用委托 ...

随机推荐

  1. PHP(Dom操作的一些基础)

    重点!! //DOM操作: // 核心思想:找到元素 操作元素// js找元素 会返回元素对象:// document.getElementById("dd");唯一确定// 返回 ...

  2. Java远程连接redis, 报错 Connection refused: connect

    在今天的学习Redis中报错 Connection refused: connect 我总结了有三种情况: 1.远程服务器中的Redis没有开启. 2.远程连接地址出错,或者是端口出错. 3.远程服务 ...

  3. 360自带--JS开发工具箱

    360自带–JS开发工具箱 360自带–JS开发工具箱 360自带–JS开发工具箱

  4. 消息系统kafka原理解析

    Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Clouder ...

  5. c->log技巧

    介绍: 在C代码里,有时会加入一些打印信息方便分析问题,可用如下代码替代打印函数,更加方便. // // Created by lady on 18-12-10. // #include <st ...

  6. docker+httpd的安装

    docker pull docker.io/httpd //直接这么运行会报“没有conf/httpd.cong这个文件” docker run -d --name httpd2. -p : -p : ...

  7. 苹果cms安装及配置详细教程

    听说这个好!php+mysql的 下载 http://www.maccms.com/down.html 下载之后解压到你的网站跟目录中,就像这个样子的   后台目录 然后重要的一步来了,在ftp工具上 ...

  8. 记录下diagwait的问题

    对于Oracle集群,有关diagwait的解释可以很容易在网上搜到: 该问题只会出现在ORACLE 11.2 以前版本中,在 11G R2版本中,diagwait的值默认配置为13. 而针对11.2 ...

  9. centos7安装redist 以及redis扩展

    wget http://download.redis.io/releases/redis-3.2.1.tar.gz   用wget下载 $ tar xzf redis-3.2.1.tar.gz   解 ...

  10. HTML常用标签定义,用法及例子

    1.HTML注释 <!--...--> 定义:使用注释可对代码进行解释,不会显示在浏览器中. <!--这是一段呢注释.注释不会在浏览器中显示.--> <p>段落标签 ...