1

我在配置文件中捕获了这样的值:

file = io.open("testch", "r") -- testch is config file in same directory
file:read("*l")

file:seek("cur", 17)
version = file:read("*l")
_, _, version = string.find(version, "(%d+.%d+)'")

file:seek("cur", 19)
serialnum = file:read("*l")
_, _, serialnum = string.find(serialnum, "(%d+)'")

file:seek("cur", 15)
power = file:read("*l")
_, _, power = string.find(power, "(%d+)'")

io.close(file)

/* below code is config file in the same directory with upper one */
config test
       option version '1.0'
       option serialnum '1234567890'
       option power '30'

但是,当我单击 Luci 中的 Save&Apply 按钮以更改配置文件中的值时,更改后的数组如下所示。

那是我的问题。当配置文件的数组顺序改变时,我的解决方案不能适用于这种情况。(我的解决方案可以应用于固定情况。)

是否有适用于每种情况的解决方案(配置文件的数组已更改大小写)?

4

1 回答 1

1

我个人的偏好是使用 Lua 作为配置语言。已经使用 Lua 时很容易完成;它允许您使用图灵完备的语言和用户定义的库进行高级配置;并完全避免您遇到的问题。

只需将您的配置文件重新格式化为有效的 Lua 并用于loadfile()将配置文件作为块加载,如果没有问题则执行。下面代码中的变量s是 Lua 配置文件将执行的环境。给它一个空表意味着您不传递任何内容供配置脚本使用(没有表库、pairs()函数等)。你可以传入你自己的环境表(ENV),但这被认为是不可思议的不安全,因为配置脚本可能会覆盖您的环境,导致以新的和难以跟踪的方式破坏,或者允许攻击者运行恶意代码。最好的办法是根据配置脚本的需要重新创建配置环境。并确保清理您的输入!不要相信用户不是白痴或邪恶的。

config

version = '1.0'
serialnum = '1234567890'
power = '30'

load.lua

local s = {}
assert(loadfile("config", "t", s))()

print(s.version)
print(s.serialnum)
print(s.power)
于 2017-11-26T14:09:10.223 回答