lua工具库penlight--08额外的库(二)
执行一系列的参数
类型说明符也可以 是' ('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额外的库(二)的更多相关文章
- lua工具库penlight--08额外的库(一)
额外的库 在这一节中的库不再被认为是Penlight的核心部分,但在需要时,仍提供专门的功能. 简单的输入的模式 Lua 的字符串模式匹配是非常强大,通常您将不需要传统的正则表达式库.即便如此,有时 ...
- lua工具库penlight--09技术选择
模块化和粒度 在理想的世界,一个程序应该只加载它需要的库.Penlight需要额外100 Kb 的字节码来工作.它是简单但却乏味要加载你需要什么: local data = require 'pl.d ...
- lua工具库penlight--01简介
lua的设计目标是嵌入式语言,所以和其它动态语言(如python.ruby)相比其自带的库缺少很多实用功能. 好在有lua社区有Penlight,为lua提供了许多强大的功能,接下来的几篇博客,我会简 ...
- 阿里UX矢量图标库–最强大的矢量图标库(Icon font制作力荐工具)
继前面介绍过ICON-FONT的制作后,找了几个ICON库都是国外的今天偶然发现阿里巴巴的图标矢量库,www.iconfont.cn用了之后感觉很强大,丰富的图标库(集合阿里妈妈&淘宝的图标库 ...
- LTUI v1.1, 一个基于lua的跨平台字符终端UI界面库
简介 LTUI是一个基于lua的跨平台字符终端UI界面库. 此框架源于xmake中图形化菜单配置的需求,类似linux kernel的menuconf去配置编译参数,因此基于curses和lua实现了 ...
- 优秀工具推荐:超实用的 CSS 库,样板和框架
当启动一个新的项目,使用 CSS 框架或样板,可以帮助您节省大量的时间.在这篇文章中,我编译整理了我最喜欢的 CSS 样板,框架和库,帮助你在建立网站或应用程序时更加高效. 您可能感兴趣的相关文章 精 ...
- iOS开发中静态库制作 之.a静态库制作及使用篇
iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...
- SDL_Test库(1)——SDL不用TTF库绘制文字
SDL库有很多的扩展,这很方便.但是每个扩展库都很臃肿,一般都会拖上额外的两三个开源库,更有甚者,扩展库的大小比SDL库本身还大得多.但有一个自带的.很有用的库很容易被大家忽视.它就是本文要讲的SDL ...
- boost库的安装,使用,介绍,库分类
1)首先去官网下载boost源码安装包:http://www.boost.org/ 选择下载对应的boost源码包.本次下载使用的是 boost_1_60_0.tar.gz (2)解压文件:tar - ...
- 毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选
毕加索的艺术--Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选 官网: http://square.github.i ...
随机推荐
- SQL Server Service Broker 简单例子 (转)
SQL Server Service Broker服务体系结构 消息类型 — 定义应用程序间交换的消息的名称.还可以选择是否验证消息.约定 — 指定给定会话中的消息方向和消息类型.队列 — 存储消息. ...
- 开发者和系统管理者最喜爱的开源工具Vim 起步学习的五个技巧
多年来,我一直想学 Vim.如今 Vim 是我最喜欢的 Linux 文本编辑器,也是开发者和系统管理者最喜爱的开源工具.我说的学习,指的是真正意义上的学习.想要精通确实很难,所以我只想要达到熟练的水平 ...
- 截短字符串的函数(JS中适用)
function cutShort(str){ if(str.length>15){ str=str.substr(0,15)+"..."; } ...
- exosip/osip 杂项
exosip 对比osip osip2和eXosip2协议 exosip 和 pjsip 简介 如果要实现嵌入式设备上的SIP电话或者其它,PJSIP是我所见的Coding和Design最为优秀的了, ...
- shareSDK(分享第三方库)的 使用
首先,下载第三方库,可以去官网下载,官网的地址我忘记了,但下面有一个我之前下的和我写的例子,其实官方的例子也写我们只是告诉大家用时需要把哪些代码复制出来就可以用了. 1.导入如下框架和第三方库 新浪微 ...
- 自己定义iOS上双击Home键图切换
假设双击Home.会来到iOS App的switcher页面,在这儿列出了当前系统挂起的App, 上面有每一个App的切屏,相信大家都熟悉这个东东了. 它事实上是每一个App在挂起前,对App后个载屏 ...
- Xcode 生成 ipa包
原地址:http://zengwu3915.blog.163.com/blog/static/2783489720136213239916/ app store的审核收费的需要二周,免费的需要一个月左 ...
- webservice接口示例(spring+xfire+webservice)
webservice接口示例(spring+xfire+webservice) CreateTime--2018年4月2日17:36:07 Author:Marydon 一.准备工作 1.1 ja ...
- 分享阿里云SLB-负载均衡的实现基本原理架构
负载均衡技术原理浅析 https://help.aliyun.com/knowledge_detail/39444.html?spm=5176.7839438.2.6.XBbX5l 阿里定制版的LVC ...
- Android 设计的几处硬伤
[核心提示] 一些 Android App 不仅仅是设计风格的问题,产品交互上也比较混乱,造成用户体验不一致,这一部分原因也是 Android 当初设计时遗留的问题. 前几天看到 NovaDNG 介绍 ...