用 Lua 解析參數(shù)
大多數(shù)計(jì)算機(jī)命令由兩部分組成:命令和參數(shù)。命令是要執(zhí)行的程序,而參數(shù)可能是命令選項(xiàng)或用戶輸入。如果沒(méi)有這種結(jié)構(gòu),用戶將不得不編輯命令的代碼,以改變命令所處理的數(shù)據(jù)。想象一下重寫 ??printf??? 命令只是為了讓你的計(jì)算機(jī)用 “hello world” 消息問(wèn)候你。參數(shù)對(duì)于交互式計(jì)算至關(guān)重要,??Lua 編程語(yǔ)言??? 提供了 ??{...}?
? 表達(dá)式來(lái)封裝在啟動(dòng) Lua 腳本時(shí)給定的可變參數(shù)。
在 Lua 中使用參數(shù)
幾乎每一個(gè)給計(jì)算機(jī)的命令都假定一個(gè)參數(shù),即使它期望參數(shù)是一個(gè)空列表。 Lua 會(huì)記錄啟動(dòng)后寫入的內(nèi)容,即使你可能對(duì)這些參數(shù)不做任何操作。要在 Lua 啟動(dòng)時(shí)使用用戶提供的參數(shù),請(qǐng)迭代 ??{...}?
? 表:
運(yùn)行代碼:
參數(shù)是不安全的,Lua 會(huì)完全按照輸入的方式打印所有參數(shù)。
解析參數(shù)
對(duì)于簡(jiǎn)單的命令,Lua 的基本功能足以解析和處理參數(shù)。這是一個(gè)簡(jiǎn)單的例子:
在 ??setup?
? 部分,將所有命令參數(shù)轉(zhuǎn)儲(chǔ)到名為 ??args?
? 的變量中。
在 ??engine?
? 部分,創(chuàng)建一個(gè)名為 ??echo?
? 的函數(shù),用于打印你“輸入”其中的任何內(nèi)容。
最后,在 ??go?
? 部分,解析 ??args?
? 變量(用戶在啟動(dòng)時(shí)提供的參數(shù))中的索引和值。在此示例代碼中,為清楚起見,第一個(gè) ??for?
? 循環(huán)僅打印每個(gè)索引和值。
第二個(gè) ??for?
? 循環(huán)使用索引來(lái)檢查第一個(gè)參數(shù),它被假定是一個(gè)選項(xiàng)。此示例代碼中唯一有效的選項(xiàng)是 ??--say?
?。如果循環(huán)找到字符串 ??--say?
?,它會(huì)調(diào)用 ??echo?
? 函數(shù),并將當(dāng)前參數(shù)的索引 加 1(下一個(gè) 參數(shù))作為函數(shù)參數(shù)提供。
命令參數(shù)的分隔符是一個(gè)或多個(gè)空格。運(yùn)行代碼查看結(jié)果:
大多數(shù)用戶都知道在向計(jì)算機(jī)發(fā)出命令時(shí)空格很重要,因此在這種情況下刪除第三個(gè)參數(shù)是預(yù)期的行為。下面是演示兩種有效“轉(zhuǎn)義”方法的變體:
解析參數(shù)
手動(dòng)解析參數(shù)簡(jiǎn)單且無(wú)依賴性。但是,你必須考慮一些細(xì)節(jié)。大多數(shù)現(xiàn)代命令都允許使用短選項(xiàng)(例如,??-f?
?)和長(zhǎng)選項(xiàng)(??--foo?
?),并且大多數(shù)命令都提供 ??-h?
? 或 ??--help?
? 或者在沒(méi)有所需參數(shù)時(shí)顯示幫助菜單。
使用 ??LuaRocks?? 可以輕松安裝其他庫(kù)。有一些非常好的工具,例如 ??alt-getopt??,它們?yōu)榻馕鰠?shù)提供了額外的基礎(chǔ)設(shè)施。