当前位置: 首页 > 科技观察

用Lua解析参数

时间:2023-03-17 12:25:36 科技观察

大多数计算机命令由两部分组成:命令和参数。命令是要执行的程序,而参数可以是命令选项或用户输入。如果没有此结构,用户将不得不编辑命令的代码以更改命令处理的数据。想象一下重写printf命令只是为了让您的计算机用“helloworld”消息问候您。参数对于交互式计算至关重要。Lua编程语言提供了{...}表达式来封装启动Lua脚本时给定的可变参数。在Lua中使用参数几乎每个给计算机的命令都假定一个参数,即使它期望一个空的参数列表。Lua会在启动后记录写入的内容,即使你可能不会对这些参数做任何事情。要在Lua启动时使用用户提供的参数,迭代{...}表:localargs={...}fori,vinipairs(args)doprint(v)end运行代码:$lua./myargs.lua$lua./myargs.luafoo--barbazfoo--barbaz----参数不安全,Lua将按照输入的方式打印所有参数。解析参数对于简单的命令,Lua的基本功能足以解析和处理参数。这是一个简单的例子:--setuplocalargs={...}--enginefunctionecho(p)print(p)end--gofori,vinipairs(args)doprint(i..":"..v)endfori,vinipairs(args)doifargs[i]=="--say"thenecho("echo:"..args[i+1])在设置部分结束,将所有命令参数转储到一个名为args的变量。在引擎部分,创建一个名为echo的函数,它会打印您“键入”到其中的任何内容。最后,在go部分,解析args变量(用户在启动时提供的参数)中的索引和值。在此示例代码中,为清楚起见,第一个for循环仅打印每个索引和值。第二个for循环使用索引来检查第一个参数,假定它是一个选项。此示例代码中唯一有效的选项是--say。如果循环找到字符串--say,它调用echo函数,提供当前参数的索引加上1(下一个参数)作为函数参数。命令参数的分隔符是一个或多个空格。运行代码查看结果:$lua./echo.lua--sayzombieapocalypse1:--say2:zombie3:apocalypseecho:zombie大多数用户都知道在向计算机发出命令时空格很重要,所以在这种情况下删除行三个参数是预期的行为。以下是演示两种有效“转义”方法的变体:$lua./echo.lua--say"zombieapocalypse"1:--say2:zombieapocalypseecho:zombieapocalypse$lua./echo.lua--sayzombie\apocalypse1:--say2:zombieapocalypseecho:zombieapocalypse解析参数手动解析参数很简单,没有依赖。但是,您必须考虑一些细节。大多数现代命令都允许短选项(例如-f)和长选项(--foo),并且大多数提供-h或--help或在没有必需参数时显示帮助菜单。使用LuaRocks可以轻松安装其他库。有一些非常好的工具,例如alt-getopt,它们为解析参数提供了额外的基础设施。