zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    [转]MySQL索引类型
    [转]数据结构(全)
    [转]数据结构基础概念篇
    [转]从零开始搭建创业公司后台技术栈
    将博客搬至CSDN
    编译android源代码(aosp)
    【Android】Fresco图片加载框架(二)————Producer
    【Android】Fresco图片加载框架(一)————源码简要分析
    TSL(SSL)相关内容
    谨慎使用AsyncTask
  • 原文地址:https://www.cnblogs.com/xdao/p/lua_penlight08_2.html
Copyright © 2011-2022 走看看