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额外的库(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快速选择实例
- 下一篇: 深入分析Volatile的实现原理