zoukankan      html  css  js  c++  java
  • lua:lua作配置文件

    lua的一项重要用途就是作为一种配置语言(configuration language)。

    目前,我们常用的配置文件格式有XML和ini,  XML层次分明,但其缺点就是写起来太繁杂,对一些关键字如<>之类的处理比较特殊。而ini呢,配置不够灵活,只有简单的段-

    键-值模式,对于一些多层结构的配置,或者一些列表类型的配置,就显得力不从心了,往往需要编码人员自己分割字符串。

    Lua脚本非常简洁清晰,是非常适合做配置文件的,无论是映射表型配置,还是列表型配置,还是简单的键值配置,lua都可以完全胜任。而且lua格式清新简洁,一看就懂。

    下面的代码主要是读变量和table。

    mycon.lua

    --my config 
    
    width = 300
    height = 400
    
    luat_Test1={a=123, b=456, c=789}
    luat_Test2={123, 456, 789}

    这里说个题外话,Lua不会根据一个范围的值来创建表,而是根据设定的单个值来创建表内容,比如:

    textTable = {}
    
    textTable[2000] = "hello 2000!"

    这里虽然会生成许多未使用的Key,但不必担心这个方法会牺牲任何表的存储空间。

    main.cpp

    #include<stdio.h>  
      
    //如不用extern会出现连接错误,编译成了C++文件  
    extern "C"   
    {  
    #include "lua.h"  
    #include "lauxlib.h"  
    #include "lualib.h"  
    }  
      
    #pragma comment(lib, "lua5.1.lib")  
      
    void ReadVariable (lua_State *L,int *width,int *height){  
        lua_getglobal(L,"width");   //获得Lua中变量的值,将其放入栈中  
        lua_getglobal(L,"height");  
      
        if(!lua_isnumber(L,-2))     //栈顶为-1,然后依次减少  
            luaL_error(L,"`width' should be a number
    ");  
      
        if(!lua_isnumber(L,-1))  
            luaL_error(L,"`height' should be a number
    ");  
        *width = (int)lua_tonumber(L,-2);    //将栈顶元素转化为数字  
        *height = (int)lua_tonumber(L,-1);  
        printf("width is %d ,height is %d
    
    ",*width,*height);  
    }  
      
    static void ReadTableFromItem(lua_State *L, const char* lpszTableName, const char* lpszTableItem)  
    {  
        lua_getglobal(L, lpszTableName);  
      
        lua_pushstring(L, lpszTableItem);//首先把元素的名字压入栈顶  
        lua_gettable(L, -2);//值会放在栈顶,同时刚才压入的元素名字被弹出  
        printf("%s.%s=%d
    ", lpszTableName, lpszTableItem, (int)lua_tonumber(L, -1));  
        lua_pop(L, 2);  
    }  
      
    static void ReadTableFromIndex(lua_State *L, const char* lpszTableName, int index)  
    {  
        lua_getglobal(L, lpszTableName);  
        lua_rawgeti(L, -1, index);//获得第一个元素  
        printf("%s[%d]=%d
    ", lpszTableName, index, (int)lua_tonumber(L, -1));  
        lua_pop(L, 2);  
    }  
      
    static void EnumTableItem(lua_State *L, const char* lpszTableName)  
    {  
        lua_getglobal(L, lpszTableName);  
        int it = lua_gettop(L);  
        lua_pushnil(L);  
        printf("Enum %s:", lpszTableName);  
        while(lua_next(L, it))//用lua_next可以遍历这个数组  
        {  
            printf("  %d", (int)lua_tonumber(L, -1));  
            lua_pop(L, 1);  
        }  
        printf("
    
    ");  
        lua_pop(L, 1);  
    }  
      
    int main(int argc, char* argv[])  
    {  
        if (argc != 2)  
        {  
            printf("param error!
    ");  
            return 0;  
        }  
      
        char *filename = argv[1];  
      
        lua_State *L = lua_open();  
        luaL_openlibs(L);  //新版本库添加的方法  
        if(luaL_loadfile(L,filename) || lua_pcall(L,0,0,0)){  
            luaL_error(L,"loadfile error! %s 
    ",lua_tostring(L,-1));  
        }  
      
        int w=1,h=2;  
        ReadVariable(L,&w,&h);  
      
        ReadTableFromItem(L, "luat_Test1", "a");  // 等价与lua代码:print(luat_Test1.a)  
        ReadTableFromItem(L, "luat_Test1", "b");  
        ReadTableFromItem(L, "luat_Test1", "c");  
        EnumTableItem(L, "luat_Test1");    // 枚举Table  
      
        ReadTableFromIndex(L, "luat_Test2", 1);  // 等价与lua代码:print(luat_Test1[1])  
        ReadTableFromIndex(L, "luat_Test2", 2);  
        ReadTableFromIndex(L, "luat_Test2", 3);  
        EnumTableItem(L, "luat_Test2");  
        getchar();
        return 0;
    }

    关于配置文件安全的问题,一般会将这些lua文件进行加密。

    配置文件多数以excel转lua的方式配置,网上也有很多相关工具。例如用xlrd

  • 相关阅读:
    1393 0和1相等串 鸽笼原理 || 化简dp公式
    C. Coin Troubles 有依赖的背包 + 完全背包变形
    D. PolandBall and Polygon BIT + 欧拉公式
    51NOD 1639 绑鞋带 数学
    D. Fedor and coupons 二分暴力
    hdu 4104 Discount
    bnu 51640 Training Plan DP
    hdu 5745 La Vie en rose DP + bitset优化
    hdu 5036 Explosion bitset优化floyd
    1354 选数字 DP背包 + 数学剪枝
  • 原文地址:https://www.cnblogs.com/losophy/p/9257470.html
Copyright © 2011-2022 走看看