【问题标题】:String to Table in LuaLua中的字符串到表
【发布时间】:2010-08-19 05:15:26
【问题描述】:

我正在使用 LuaSocket 和 http.request 调用远程 PHP 脚本,该脚本生成 Lua 表并将其输出到浏览器。

当我将 http.request 响应存储在一个变量中时,它是一个字符串,这会导致该表在我的 Lua 代码中不可用。

例如:

eventData = http.request("http://www.example.com/events.php")
print( eventData )

--print outputs this "string", that is really a Lua table that PHP generated
months={
    'January',
    'February',
    'March',
    'April',
    'May',
    'June',
    'July',
    'August',
    'September',
    'October',
    'November',
    'December',
}

如果我尝试调用months[4],例如,它会出错并显示“尝试索引全局'months'(一个零值)”。 如何将该字符串转换为可用表?

谢谢!

【问题讨论】:

    标签: lua


    【解决方案1】:

    你可以使用loadstring创建一个你可以执行的lua块。

    eventData = [[
    months = {
        'January',
        'February',
        'March',
        'April',
        'May',
        'June',
        'July',
        'August',
        'September',
        'October',
        'November',
        'December',
    }
    ]]
    
    loadstring(eventData)()
    if months then
        print(table.concat(months, ", "))
    end
    

    【讨论】:

    • 从技术上讲,您应该使用assert(loadstring(eventData))() 来传播所提供代码中的任何语法错误(而不是仅仅弹出一个无法解释的“尝试调用零值”错误)。
    • 我在这里看到一个严重的安全问题,json 和一个合适的解析器或类似 lua 语法的类似方法将是正确的方法。
    【解决方案2】:

    从 Lua 5.2 开始,load 支持字符串作为参数。因此,您现在可以使用 Adam 的答案,将 loadstring 替换为 load。

    请注意,load(eventData) 创建一个“函数”类型的块,load(eventData)() 创建一个块并调用它——从而创建您的表。这让我绊倒了一会儿。

    【讨论】:

      猜你喜欢
      • 2020-02-20
      • 2018-11-07
      • 2022-01-09
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      • 2017-10-11
      相关资源
      最近更新 更多