如何捕获修改后的配置文件中的值

我已经像这样捕获了配置文件中的值:

file = io.open("testch", "r") -- testch 是同一目录中的配置文件
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)

/* 下面的代码是与上面那个同一目录中的配置文件 */
config test
       option version '1.0'
       option serialnum '1234567890'
       option power '30'

然而,当我在 Luci 中点击保存和应用按钮以更改配置文件中的值时,更改后的数组如下所示。

这是我的问题。当配置文件的数组顺序发生改变时,我的解决方案就无法适用。 (我的解决方案可以适用于固定的情况。)

是否有一种适用于每种情况(包括配置文件的数组顺序已更改的情况)的解决方案?

点赞
用户6614127
用户6614127

我的个人偏好是使用 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-26 14:09:10