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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET 6 Preview 6 Released

宣布 .NET 6 Preview 6Richard 2021 年 7 月 14 日我们很高兴发布 .NET 6 Preview 6。Preview 6 是我们进入 RC 时期之前的倒数第二个预览版。将有两个 RC 版本。此版本本身相对较小&#xff0c;而 Preview 7 会更大一些。在那之后&#xff0c;我们将进行质量修复&#xff0c;直…

SQL2K数据库开发十五之表操作查看表中的数据

1.可以使用SELECT语句查询表中的数据。如在查询分析器中执行SELECT * FROM Products语句就可以查询Products表中的数据&#xff0c;如下图&#xff1a;2.如在企业管理器中查询表中数据&#xff0c;则要展开sample数据库&#xff0c;在Products表上右击鼠标&#xff0c;在弹出的…

转:VC6.0与VC.net的具体区别

原文&#xff1a;http://www.itzhe.cn/article/20080302/98267.html 对于VC6.0和VC.net本人有几点疑问。 1.首先&#xff0c;vc.net开发的程序是否依然需要.net框架的支持&#xff1f;是否可以独立运行&#xff1f; 2.对与VC.net开发出来的程序在运行效率上和VC6.0开发的差距…

中考新大纲:初中数学无非就这26个考点!孩子吃透,再笨也能考115分!

全世界只有3.14 % 的人关注了青少年数学之旅升入初二、初三后数学难度急速上升&#xff0c;您的孩子是否学得吃力成绩却无法提高&#xff1f;1.总说自己上课都能听懂&#xff0c;可题目稍微一变就不会做&#xff1b;2.连课下时间都在刷题&#xff0c;到头来做的全是无用功&…

程序员(工作2年)立flag,面四家,成三家,最后进了蚂蚁.....

作为一个毕业2年的coder, 最近一直在寻找一个合适的机会能够换一个环境&#xff0c;一是寻找一个更加宽阔的舞台不断的提升自己&#xff0c;二是让自己走出现在的舒适区域&#xff0c;迎接更多的挑战和认识更多的人。当然还有为了获得更加好的一份收入。 这一个月&#xff0c;…

深入分析Volatile的实现原理

2019独角兽企业重金招聘Python工程师标准>>> 术语英文单词 描述 共享变量在多个线程之间能够被共享的变量被称为共享变量。共享变量包括所有的实例变量&#xff0c;静态变量和数组元素。他们都被存放在堆内存中&#xff0c;Volatile只作用于共享变量。内存屏障Memor…

Serilog 最佳实践

Serilog 最佳实践概述Serilog[1]是 Microsoft .NET 的结构化日志记录库&#xff0c;并已成为Checkout.com 上NET 的首选日志记录库。它支持各种日志记录目的地&#xff08;称为接收器[2]&#xff09;包从标准控制台和基于文件的接收器到日志服务&#xff0c;如 Datadog。本指南…

Spring的API获取泛型实际类型

文章目录 学习链接Spring中获取泛型类型类上有约束的泛型BaseService\<T> &#xff08;带泛型父类&#xff09;CustomService\<T, K,U> &#xff08;带泛型接口&#xff09;CustomServiceImpl &#xff08;指定泛型具体类型&#xff09;GenericTest 获取类上的泛型…

我想跳槽

我是个小文员。公司很小&#xff01;2007年8月来到这个公司的&#xff01;我不喜欢我现在的工作&#xff0c;因为它不是我想要的&#xff01;我喜欢的是关于“IT”方面的工作&#xff0c;当然“IT”这个概念很大&#xff01;我想从事软件开发或者软件测试这方面的工作&#xff…

世界上迄今为止最安全的加密算法

全世界只有3.14 % 的人关注了青少年数学之旅一个只能用算力来破解的加密算法1人类的加密史公元前5世纪&#xff0c;古希腊人使用一根叫scytale的棍子来传递加密信息。要加密时&#xff0c;先绕棍子卷一张纸条&#xff0c;把信息沿棒水平方向写&#xff0c;写一个字旋转一下&…

手把手教你java快速过滤关键词

java过滤关键词 敏感词、文字过滤是一个网站必不可少的功能&#xff0c;如何设计一个好的、高效的过滤算法是非常有必要的。前段时间我一个朋友&#xff08;马上毕业&#xff0c;接触编程不久&#xff09;要我帮他看一个文字过滤的东西&#xff0c;它说检索效率非常慢。我把它程…

[Delphi]根据输入日期按年月周日输出日期段

输入变量ADateStart&#xff0c;并为其填写起始日期&#xff0c;变量ADateEnd&#xff0c;计算类型AType&#xff0c;输出变量ADateStart&#xff0c;变量ADateEnd procedureFormatDateByType(AType:Integer; varADateStart, ADateEnd: TDate); var//type0日 1周 2月 3年 …

TIOBE 发布 8 月编程语言榜单:C# 排名如何?

刚刚 TIOBE 官方最新发布了 8 月的编程语言榜单&#xff0c;一起来看本月榜单中有什么值得关注的发展趋势吧&#xff1f;每一种编程语言的兴起从来都离不开它所适用的技术领域&#xff0c;二者之间一直以来都是水涨船高的关系。数据挖掘和人工智能的蓬勃发展也是如此&#xff0…

两年了,你还是那个你 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源都市音酱&#xff0c;侵权删&#xff09;

Delphi 的字符及字符串[4] - 字符串、字符指针与字符数组

//字符串 < > 字符数组 vararr: array[0..5] of Char;str: string; begin{可以把字符串常量直接赋给字符数组; 但超界不行}arr : Delphi;ShowMessage(arr); {Delphi}{可以把字符数组直接赋给字符串变量}str : arr;ShowMessage(str); {Delphi}{其实字符串内部也是包含了一…

职场智慧之如何提升自己在公司的价值

一个人要想在公司立足&#xff0c;成为公司不可或缺的人才&#xff0c;并得到公司的重用和青睐&#xff0c;只有让自己对公司具有更大的价值&#xff0c;那么如何提升自己在公司的价值呢&#xff1f;1&#xff0e;任务分配&#xff0c;不怕累&#xff0c;多干活任何公司、老总都…

Java IO(一)

【例1】创建一个新文件import java.io.*; class hello{public static void main(String[] args) {File fnew File("D:\\hello.txt");try{f.createNewFile();}catch (Exception e) {e.printStackTrace();}} }【运行结果】&#xff1a;程序运行后&#xff0c;在D盘下会…

Java Dao模式通过JDBC连接数据库的操作

Java程序访问数据库&#xff1a; 1、获取数据库厂商提供的驱动&#xff08;jdbc接口的实现类&#xff09; 如ojdbc14.jar——Oracle数据库驱动jar包 mysql-connector-java-5.1.8-bin.jar——MySQL数据库驱动jar包 自己去网上下载就行。 2、使用JDBC的API访问数据库 连接、…

k8s入门你至少需要会哪些

前言相信很多公司都有集成发布pass系统&#xff0c;底层大多数依赖于k8s来进行服务的发布部署/回滚等功能。对于很多业务开发者都是不可见的&#xff0c;在感叹这个东西真好用的同时&#xff0c;想着探一探这背后的原理。今天这篇k8s入门我整理了必会的几个k8s知识点&#xff0…

Windows CE的电源管理之三

本篇将以Windows Mobile为例介绍Windows CE电源管理的实现&#xff0c;大体上&#xff0c;Windows Mobile分为Pocket PC和Smartphone两种版本。这两者之间的主要区别在于触摸屏和电源模型&#xff0c;Smartphone采用的是“Always On”模型。为了说清楚它们的区别&#xff0c;我…