尝试将一个原始文件中的值与 Lua 中的另一个原始文件值匹配
Posted
技术标签:
【中文标题】尝试将一个原始文件中的值与 Lua 中的另一个原始文件值匹配【英文标题】:Trying to match values from one raw file with another raw file values in Lua 【发布时间】:2015-01-26 00:48:36 【问题描述】:首先:我是一个没有经验的程序员,刚开始阅读 PiL。我只知道一两件事,但我正在快速学习和理解。这种方法真的没有必要,但我有点想给自己一个艰难的时间来学习更多。
好的,为了测试和更多地了解语言,我试图从两个不同的文件中获取两个不同的值并将它们存储在表中
local gamemap = file.Read("addons/easymap/data/maplist.txt", "GAME")
local mapname = string.Explode( ",", gamemap )
local mapid = file.Read("addons/easymap/data/mapid.txt", "GAME")
local id = string.Explode( ",", mapid )
我正在抓取两个值,最后是 mapname 和 id
一旦我有了它们,我就知道使用
for k, v in pairs(mapname)
它将为从文件中获取的数据赋予特定的值,或者至少分配它们。
但是我需要对这两个表做的是,如果服务器中有某个地图,请检查表中的值,除非地图名称为 nil,然后一旦有了名称,就获取该地图的值并将其与另一个文件的 id 匹配。
例如,我在 maplist.txt 文件中有 gm_construct,它是第一个条目 [1],它在 mapid.txt 中对应的 id 假设它是 54321,它也是第一个条目 [1]。
但是现在我必须使用game.GetMap
函数检查服务器的当前地图,我已经解决了所有问题,我获取当前地图,将其与地图名称表匹配,然后在 id 表中检查其对应的值,这将是 gm_construct = 1。
例如是这样的
local mapdl = game.GetMap()
local match = mapname[mapdl]
if( match != nil )then --supposing the match isn't nil and it is in the table
--grab its table value, lets say it is 1 and match it with the one in the id table
这是http://pastebin.com/3652J8Pv的一个更复杂的版本
我知道这是不必要的,但执行此脚本将为我提供更多选项来进一步扩展脚本。
TL;DR:我需要找到一个函数来匹配来自不同表和文件的两个值,但最终它们的顺序相同([1] = [1 ]) 在两个文件中。或者一种从另一个文件中获取完整表的方法。我不知道是否可以全局加载表,然后被另一个文件抓取以在该文件中使用它。
很抱歉,我的要求太高了,但是我住的地方,如果你想学习编程,你必须自己做,没有学校有课程或类似的东西,至少在大学之前没有,而且我离高中毕业还差得很远。
编辑:这旨在用于 Garry 的模组。 string.Explode 在这里解释:http://wiki.garrysmod.com/page/string/Explode
它基本上用一个指定的字符来分隔短语,在这种情况下是一个逗号。
【问题讨论】:
fyi,Lua 使用~=
而不是!=
进行不等式比较。
我不明白你在这里试图做什么,但你遇到了麻烦。 string.Explode
返回什么?一张桌子?将表中的元素相互比较与比较不在表中的元素(或从常量值/nil)进行比较没有任何不同。
抱歉不清楚。但是 string.Explode 在这里解释:wiki.garrysmod.com/page/string/Explode我主要在 garry 的 mod lua 库上工作
【参考方案1】:
好的。如果我理解正确...您有 2 个包含数据的文件。
一个带有地图名称的
gm_construct,
gm_flatgrass,
de_dust2,
ttt_waterworld
还有一个带有 ID、数字、Whataver(与地图名称文件中相同位置的条目相关)
1258,
8592,
1354,
2589
现在你想找到当前地图的ID,对吧?
这是你的功能
local function GetCurrentMapID()
-- Get the current map
local cur_map = game.GetMap()
-- Read the Files and Split them
local mapListRaw = file.Read("addons/easymap/data/maplist.txt", "GAME")
local mapList= string.Explode(",", mapListRaw)
local mapIDsRaw = file.Read("addons/easymap/data/mapid.txt", "GAME")
local mapIDs = string.Explode(",", mapIDsRaw)
-- Iterate over the whole map list
for k, v in pairs(mapList) do
-- Until you find the current map
if (v == cur_map) then
-- then return the value from mapIDs which is located at the same key (k)
return mapIDs[k]
end
end
-- Throw a non-breaking error if the current map is not in the Maplist
ErrorNoHalt( "Current map is not registered in the Maplist!\n" )
end
代码可能有错误,因为我无法对其进行测试。如果是这样,请评论错误。
来源:我的经验和 GMod Wiki
【讨论】:
以上是关于尝试将一个原始文件中的值与 Lua 中的另一个原始文件值匹配的主要内容,如果未能解决你的问题,请参考以下文章
用另一个 MySQL 表的值更新一个 MySQL 表(原始表的数据类型是 JSOn)