首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Lua中存储Lua脚本

在Lua中存储Lua脚本
EN

Stack Overflow用户
提问于 2018-06-11 08:03:56
回答 1查看 584关注 0票数 2

我有一个用C++编写的应用程序,可以显示,编辑和运行Lua脚本。此应用程序存储所有内容,包括项目文件中的完整Lua脚本。

这里的问题是,项目文件的格式也是从C++编写的Lua文件(它不是一个编写项目文件的Lua引擎)。

编辑器中的示例Lua脚本:

代码语言:javascript
复制
-- Message
local message =
[["First" line
Second line
Last line]]

现在,我想将上面的脚本保存到一个lua文件中。示例项目文件:

代码语言:javascript
复制
-- Project file
projectName = "test"
options = {}
options.autoRun = false

-- Lua source
luaScript =
[=[
-- Message
local message =
[["First" line
Second line
Last line]]
]=]

当然,我可以将Lua脚本包含在=[ ... ]=中,但是如果脚本也包含相同的序列,它将无法工作。因为脚本是由用户编写的任意脚本,所以我不能简单地断定某个序列没有被使用。

有没有办法在XML中包含“原始”数据,比如CData?我会尽量避免对脚本进行编码,因为我希望它在项目文件中是可读的。

最简单的方法是如果和字符可以转义,但显然不能转义。

我可以将脚本分解成单独的字符串,对其进行转义并将其连接起来:

代码语言:javascript
复制
-- Project file
projectName = "test"
options = {}
options.autoRun = false

-- Lua source
luaScript = "-- Message\n"..
            "local message =\n"..
            "[[\"First\" line\n"..
            "Second line\n"..
            "Last line]]\n"..

但是这个解决方案不容易直接在项目文件中读取和编辑。

如果这是不可能的,那么让它得到确认是很好的,我会选择一种编码方案,而不是B计划。

解决方案

在探索了一些选项和索引之后,我采用了基于lhf的建议的解决方案。我已经向Lua编写器类编写了一些C++,所以当我编写一个字符串时,我会检查它是否是一个多行字符串。如果是,我只需在前面插入[====================================================================[ -- MULLTILINE BEGIN\r\n并在字符串后面添加\r\n]====================================================================] -- MULLTILINE END,就不需要对字符串进行转义。如果它是一个单行字符串,我不会添加任何东西,只对它进行转义。

添加CR/LF对和注释的原因是为了方便用户直接在项目文件中编辑脚本。

代码语言:javascript
复制
script =
[====================================================================[ -- MULLTILINE BEGIN
-- Lua script engine 5.3.4
function onData(data,ch)
  print("A 'String' within a \"string\" within a [===[string]===]")
end

-- Multiline within Multiline
a = [=[
Spicy jalapeno bacon ipsum dolor amet ground round eu chicken,
venison turkey corned beef dolore exercitation pastrami nostrud
prosciutto in drumstick deserunt meatloaf. Pastrami jowl beef
ribs minim eu pariatur est et lorem kielbasa shoulder. Dolore
officia cupidatat, biltong tempor ut ham kielbasa magna bacon
salami. Turducken tri-tip tail reprehenderit tenderloin aliquip.
]=]

print(a)
]====================================================================] -- MULLTILINE END

在回读字符串时,我只是在第一行查找-- MULTILINE BEGIN\r\n。如果它在那里,我只需删除这一行,包括CR/LF对和最后的CR/LF对。因为-- MULLTILINE END是多行之外的注释,所以它不会是字符串的一部分,也不需要删除,只需要删除在结束序列之前添加的CR/LF对。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-11 08:10:02

您可以根据需要在一个长字符串引号[====[中使用任意多个=。只需在字符串中找到最长的=运行并添加一个=即可。

您还可以在string.format中使用%q,它将引用所有需要引用的字符。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50789092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档