Perl模块 Getopt::Long 解析

Getopt::Long模块

Getopt::Long模块是用于解析命令行参数的Perl模块:

## option variables with default value
my $verbose = "";
my $nda = "";
my $more = 0;
my $value = "";
my @libs = ();
my %defines = ();

## parse options from @ARGV
GetOptions(
    'v|verbose' => \$verbose,
    'nda!' => \$nda,
    'more+' => \$more, 
    't|tag=s' => \$tag,
    'value:s' => \$value,
    'b|libs=i' => \@libs, ## 'libs=i@' => \$libs,
    'define=s' => \%defines, ## 'define=s%' => \$defines,
    'set'   =>  \&handle,
) or die $!;

my $verbose = "";

sub handle {
    $verbose = 100;
    print "options \'--set\' set verbose $verbose\n";
}

选项解析

  1. verbose,只有单独的一个选项,不接受任何参数。在命令行用--verbose|-v来触发,触发后$verbose被设置为1,次用法常作为一个开关选项使用,此处使用了多命名方式,--verbose-v是一样的。
  2. nda!,该选项在nda后加一个!,表示可以接受--nda和--nonda两个选项,对应的将nda设置为1和0,如果触发该选项,nda值为""(即空值),可以用perl内置函数length检测$nda。
  3. more+该选项的+表示在参数列表每出现一次--more,对应的变量$more自加1。
  4. tag=s该选项必须接受一个string参数,= 表明必须要接受一个参数,s 表明参数为任意字符串,也可用if指明参数为整数或浮点数。
  5. value:stag=s的唯一区别是: 表明不是必须接受一个参数,可以--value形式调用,s默认赋值为"",i/f默认赋值为0。
  6. libs=i指定一个数组引用@libs,表明可以多次使用"--libs <lib>" 或者 "-b <lib>" 获取多个值并存到数组中,也可以使用另一种形式'libs=i@' => \$libs,如果要使用"--libs <lib1> <lib2> <lib3>"这种参数调用形式,在GetOptions()中使用 'libs=i{3}' => @libs 指定每次传入3个值。可以试试'libs=i{1,}' => @libs。
  7. define=s指定一个hash引用%defines,用--define os=linux传入一个hash参数,也可写成"define=s%" => \$defines;其他特点同上一个段落。
  8. set指定调用子程序(subroutines)。

捆绑选项

use Getopt::Long;

Getopt::Long::Configure("bundling"); # 使用捆绑选项,default: disable
# 单个字符组成的:  -a -s -l
# 单个字符绑定起来:-asl
# 参数可能会带值,参数和值之间可以有空格,也可以没有:-s 24或-s24
# 可以用长名字来做更多的描述,前面用两个-:--size=24 或 --size 24

Getopt::Long::Configure("bundling_override"); # 用长选项重写`bundling`中出现的短选项,default: disable

Getopt::Long::Configure("ignore_case"); # default: enable,大小写不敏感,对bundling状态的-<single-character>选项无效;no_ignore_case该选项禁用,同时也会禁用ignore_case_always

Getopt::Long::Configure("ignore_case_always"); # 针对bundling状态的大小写忽略,default: disable

Getopt::Long::Configure("pass_through"); # 对于GetOptions()中无法识别或者不需要识别或者无效的选项,都不会返回错误。可以用于多级程序调用时的参数传递。因为GetOptions()会将识别的选项从@ARGV中取出,所以剩余的内容就可以继续传递到下一级程序。default: disable

Getopt::Long::Configure("debug"); # 查看Getopt::Long模块处理参数时的debug信息,default: disable

‘<>’

使用GetOptions解析命令行时,当遇到无法识别的字符或者本来不是命令行选项的选项,可以用<>捕获。

## '<>'只能指向函数引用,可以通过函数做很多有意义的事
GetOptions(
    '<>' => \&handle,
) or die ;

sub handle 
{
    my $catch = shift;
    print "catch: $catch\n";
}

References

Perl中的Getopt::Long模块

perl模块 Getopt::Long解析参数

                        —— dulunar 后记于 2020.12
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容