执行一系列的参数

类型说明符也可以 是' ('MIN '..' MAX)' 的形式。

local lapp = require 'pl.lapp'

local args = lapp [[

Setting ranges

<x> (1..10)  A number from 1 to 10

<y> (-5..1e6) Bigger range

]]

print(args.x,args.y)

下面的意思是大与或等于 MIN 和小于或等于MAX ;没有规定强制参数必须是整数。

类型说明符也可以是定义自定义类型,如:

lapp = require ('pl.lapp')

lapp.add_type('integer','number',

function(x)

lapp.assert(math.ceil(x) == x, 'not an integer!')

end

)

local args =  lapp [[

<ival> (integer) Process PID

]]

print(args.ival)

lapp.add_type需要三个参数,类型名称、 转换器和约束函数。约束函数有一个断言,如果某些条件不成立;我们使用 lapp.assert,因为条件不服合命令行脚本的标准(译注:即不符合条件就终止)。转换器参数可以是已知的 Lapp 或一个函数,可以从字符串生成一个值。

' varargs' 参数组

lapp = require 'pl.lapp'

local args = lapp [[

Summing numbers

<numbers...> (number) A list of numbers to be summed

]]

local sum = 0

for i,x in ipairs(args.numbers) do

sum = sum + x

end

print ('sum is '..sum)

尾随参数的'...'指示此参数是一个 'varargs' 参数。它必须是最后一个参数,并且 args.number 将是一个数组。

考虑下面 Mac OS x中的头实用程序实现:

-- implements a BSD-style head

-- (see http://www.manpagez.com/man/1/head/osx-10.3.php)

lapp = require ('pl.lapp')

local args = lapp [[

Print the first few lines of specified files

-n         (default 10)    Number of lines to print

<files...> (default stdin) Files to print

]]

-- by default, lapp converts file arguments to an actual Lua file object.

-- But the actual filename is always available as <file>_name.

-- In this case, 'files' is a varargs array, so that 'files_name' is

-- also an array.

local nline = args.n

local nfile = #args.files

for i = 1,nfile do

local file = args.files[i]

if nfile > 1 then

print('==> '..args.files_name[i]..' <==')

end

local n = 0

for line in file:lines() do

print(line)

n = n + 1

if n == nline then break end

end

end

因为自动生成字段files_name ,也是一个数组,我们要注意如何访问所有的文件名。

(这个脚本可能不很周到,因为 Lapp 将打开所有提供的文件,并仅在脚本结束时关闭它们。请参见另一个xhead.lua示例)。

标志和选项可能也被宣布为 vararg 数组,并可以发生在任何地方。记住,短的选项可以组合(如 tar -xzf),所以'-vvv'是完全合法 。但通常的 args.v 值只是一个简单true值。

local args = require ('pl.lapp') [[

-v...  Verbosity level; can be -v, -vv or -vvv

]]

vlevel = not args.v[1] and 0 or #args.v

print(vlevel)

vlevel 赋值有点 Lua 特色,所以考虑案件:

* No -v flag, v is just { false }

* One -v flags, v is { true }

* Two -v flags, v is { true, true }

* Three -v flags, v is { true, true, true }

定义参数的回调

如果一个脚本实现了lapp.callback,然后 Lapp 将在每个参数解析后调用它。回调被传递参数名称、 未分析的原始值和结果表。它会在赋值后立即调用,所以相应的字段是可用的。

lapp = require ('pl.lapp')

function lapp.callback(parm,arg,args)

print('+',parm,arg)

end

local args = lapp [[

Testing parameter handling

-p               Plain flag (defaults to false)

-q,--quiet       Plain flag with GNU-style optional long name

-o  (string)     Required string option

-n  (number)     Required number option

-s (default 1.0) Option that takes a number, but will default

<start> (number) Required number argument

<input> (default stdin)  A parameter which is an input file

<output> (default stdout) One that is an output file

]]

print 'args'

for k,v in pairs(args) do

print(k,v)

end

这将生成以下输出:

$ args -o name -n 2 10 args.lua

+       o       name

+       n       2

+       start   10

+       input   args.lua

args

p       false

s       1

input_name      args.lua

quiet   false

output  file (781C1B98)

start   10

input   file (781C1BD8)

o       name

n       2

当你解析参数完毕后,回调函数可以用来立即处理。

宽松模式

如果您想要使用多字母 '短' 参数,则需要将lapp.slack变量设置为true.

在下面的示例中我们也看到如何使用默认false和默认true标志,以及如何覆盖默认-h帮助标志 (—help仍然正常工作) — — 这适用于非宽松模式下。

-- Parsing the command line ----------------------------------------------------

-- test.lua

local lapp = require 'pl.lapp'

local pretty = require 'pl.pretty'

lapp.slack = true

local args = lapp [[

Does some calculations

-v, --video              (string)             Specify input video

-w, --width              (default 256)        Width of the video

-h, --height             (default 144)        Height of the video

-t, --time               (default 10)         Seconds of video to process

-sk,--seek               (default 0)          Seek number of seconds

-f1,--flag1                                   A false flag

-f2,--flag2                                   A false flag

-f3,--flag3              (default true)       A true flag

-f4,--flag4              (default true)       A true flag

]]

pretty.dump(args)

在这里我们可以看到test.lua的输出:

$> lua test.lua -v abc --time 40 -h 20 -sk 15 --flag1 -f3

---->

{

width = 256,

flag1 = true,

flag3 = false,

seek = 15,

flag2 = false,

video = abc,

time = 40,

height = 20,

flag4 = true

lua工具库penlight--08额外的库(二)的更多相关文章

  1. lua工具库penlight--08额外的库(一)

    额外的库 在这一节中的库不再被认为是Penlight的核心部分,但在需要时,仍提供专门的功能. 简单的输入的模式 Lua 的字符串模式匹配是非常强大,通常您将不需要传统的正则表达式库.即便如此,有时  ...

  2. lua工具库penlight--09技术选择

    模块化和粒度 在理想的世界,一个程序应该只加载它需要的库.Penlight需要额外100 Kb 的字节码来工作.它是简单但却乏味要加载你需要什么: local data = require 'pl.d ...

  3. lua工具库penlight--01简介

    lua的设计目标是嵌入式语言,所以和其它动态语言(如python.ruby)相比其自带的库缺少很多实用功能. 好在有lua社区有Penlight,为lua提供了许多强大的功能,接下来的几篇博客,我会简 ...

  4. 阿里UX矢量图标库–最强大的矢量图标库(Icon font制作力荐工具)

    继前面介绍过ICON-FONT的制作后,找了几个ICON库都是国外的今天偶然发现阿里巴巴的图标矢量库,www.iconfont.cn用了之后感觉很强大,丰富的图标库(集合阿里妈妈&淘宝的图标库 ...

  5. LTUI v1.1, 一个基于lua的跨平台字符终端UI界面库

    简介 LTUI是一个基于lua的跨平台字符终端UI界面库. 此框架源于xmake中图形化菜单配置的需求,类似linux kernel的menuconf去配置编译参数,因此基于curses和lua实现了 ...

  6. 优秀工具推荐:超实用的 CSS 库,样板和框架

    当启动一个新的项目,使用 CSS 框架或样板,可以帮助您节省大量的时间.在这篇文章中,我编译整理了我最喜欢的 CSS 样板,框架和库,帮助你在建立网站或应用程序时更加高效. 您可能感兴趣的相关文章 精 ...

  7. iOS开发中静态库制作 之.a静态库制作及使用篇

    iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...

  8. SDL_Test库(1)——SDL不用TTF库绘制文字

    SDL库有很多的扩展,这很方便.但是每个扩展库都很臃肿,一般都会拖上额外的两三个开源库,更有甚者,扩展库的大小比SDL库本身还大得多.但有一个自带的.很有用的库很容易被大家忽视.它就是本文要讲的SDL ...

  9. boost库的安装,使用,介绍,库分类

    1)首先去官网下载boost源码安装包:http://www.boost.org/ 选择下载对应的boost源码包.本次下载使用的是 boost_1_60_0.tar.gz (2)解压文件:tar - ...

  10. 毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选

    毕加索的艺术--Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选 官网: http://square.github.i ...

随机推荐

  1. jquery操作CSS样式全记录

    $(this).click(function(){  if($(this).hasClass(“zxx_fri_on”)){    $(this).removeClass(“zxx_fri_on”); ...

  2. 使用微软提供的Office Online实现Office文档的在线查看,编辑等功能

    使用微软提供的Office Online平台只需要一个网址即可在线查看Xls,doc,PPT等文档 http://view.officeapps.live.com/op/view.aspx?src=要 ...

  3. object sender, LinkLabelLinkClickedEventArgs e 参数解释

    开始是一个LinkLabel 控件,LinkLabel 绑定了Clicke事件 LinkLabel Delete = new LinkLabel(); Delete.Text = "删除&q ...

  4. 微信小程序 - 为何setData到页面上有的加分号

    Page({ /** * 页面的初始数据 */ data: { }, /** * 生命周期函数--监听页面加载 */ onLoad: function(options) { let _page = t ...

  5. sass 和 css 互转网址

    sass to css:https://www.sassmeister.com/ css to sass:http://css2sass.herokuapp.com/

  6. Python类,特殊方法, __getitem__,__len__, __delitem__

    特殊函数一般以__methodname__的形式命名,如:__init__(构造方法), __getitem__. __setitem__(subscriptable所需method), __deli ...

  7. com.tongyan.tutelage:bdservice_v1

    3-21 10:14:20.833 2892-2892/? E/art: No implementation found for long com.baidu.platform.comjni.map. ...

  8. oracle中如何设置主键并且让其自动增长

    由于oracle中是没有自动增长的的,需要自己去进行写触发器等方式去进行设置: 找了一下他人写的,有两种方法可以设置主键,一种是自增长主键,另一种就是生成唯一序列. 一.自增长主键 我创建一个用户的信 ...

  9. POJ 3468 A Simple Problem with Integers 【线段树,区间更新】

    题意:你有N个整数,A1,A2,-,一个.你须要处理两种类型的操作.一种类型的操作是加入了一些给定的数字,每一个数字在一个给定的时间间隔. 还有一种是在给定的时间间隔要求数量的总和. 难点:主要是la ...

  10. 恢复阿里云RDS云数据库MySQL的备份文件到自建数据库

    云数据库MySQL版使用开源软件Percona Xtrabackup对数据库进行备份,所以您可以使用该软件将云数据库MySQL的备份文件恢复到自建数据库中,本文将介绍详细的操作步骤. 关于云数据库My ...