lua学习:lua作配置文件

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

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

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

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

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

mycon.lua

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. --my config   
  2.   
  3. width = 300  
  4. height = 400  
  5.   
  6. luat_Test1={a=123, b=456, c=789}  
  7. luat_Test2={123, 456, 789}  

ps:

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

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. textTable = {}  
  2.   
  3. textTable[2000] = "hello 2000!"  

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


main.cpp

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include<stdio.h>    
  2.     
  3. //如不用extern会出现连接错误,编译成了C++文件    
  4. extern "C"     
  5. {    
  6. #include "lua.h"    
  7. #include "lauxlib.h"    
  8. #include "lualib.h"    
  9. }    
  10.     
  11. #pragma comment(lib, "lua5.1.lib")    
  12.     
  13. void ReadVariable (lua_State *L,int *width,int *height){    
  14.     lua_getglobal(L,"width");   //获得Lua中变量的值,将其放入栈中    
  15.     lua_getglobal(L,"height");    
  16.     
  17.     if(!lua_isnumber(L,-2))     //栈顶为-1,然后依次减少    
  18.         luaL_error(L,"`width' should be a number\n");    
  19.     
  20.     if(!lua_isnumber(L,-1))    
  21.         luaL_error(L,"`height' should be a number\n");    
  22.     *width = (int)lua_tonumber(L,-2);    //将栈顶元素转化为数字    
  23.     *height = (int)lua_tonumber(L,-1);    
  24.     printf("width is %d ,height is %d\n\n",*width,*height);    
  25. }    
  26.     
  27. static void ReadTableFromItem(lua_State *L, const char* lpszTableName, const char* lpszTableItem)    
  28. {    
  29.     lua_getglobal(L, lpszTableName);    
  30.     
  31.     lua_pushstring(L, lpszTableItem);//首先把元素的名字压入栈顶    
  32.     lua_gettable(L, -2);//值会放在栈顶,同时刚才压入的元素名字被弹出    
  33.     printf("%s.%s=%d\n", lpszTableName, lpszTableItem, (int)lua_tonumber(L, -1));    
  34.     lua_pop(L, 2);    
  35. }    
  36.     
  37. static void ReadTableFromIndex(lua_State *L, const char* lpszTableName, int index)    
  38. {    
  39.     lua_getglobal(L, lpszTableName);    
  40.     lua_rawgeti(L, -1, index);//获得第一个元素    
  41.     printf("%s[%d]=%d\n", lpszTableName, index, (int)lua_tonumber(L, -1));    
  42.     lua_pop(L, 2);    
  43. }    
  44.     
  45. static void EnumTableItem(lua_State *L, const char* lpszTableName)    
  46. {    
  47.     lua_getglobal(L, lpszTableName);    
  48.     int it = lua_gettop(L);    
  49.     lua_pushnil(L);    
  50.     printf("Enum %s:", lpszTableName);    
  51.     while(lua_next(L, it))//用lua_next可以遍历这个数组    
  52.     {    
  53.         printf("  %d", (int)lua_tonumber(L, -1));    
  54.         lua_pop(L, 1);    
  55.     }    
  56.     printf("\n\n");    
  57.     lua_pop(L, 1);    
  58. }    
  59.     
  60. int main(int argc, char* argv[])    
  61. {    
  62.     if (argc != 2)    
  63.     {    
  64.         printf("param error!\n");    
  65.         return 0;    
  66.     }    
  67.     
  68.     char *filename = argv[1];    
  69.     
  70.     lua_State *L = lua_open();    
  71.     luaL_openlibs(L);  //新版本库添加的方法    
  72.     if(luaL_loadfile(L,filename) || lua_pcall(L,0,0,0)){    
  73.         luaL_error(L,"loadfile error! %s \n",lua_tostring(L,-1));    
  74.     }    
  75.     
  76.     int w=1,h=2;    
  77.     ReadVariable(L,&w,&h);    
  78.     
  79.     ReadTableFromItem(L, "luat_Test1""a");  // 等价与lua代码:print(luat_Test1.a)    
  80.     ReadTableFromItem(L, "luat_Test1""b");    
  81.     ReadTableFromItem(L, "luat_Test1""c");    
  82.     EnumTableItem(L, "luat_Test1");    // 枚举Table    
  83.     
  84.     ReadTableFromIndex(L, "luat_Test2", 1);  // 等价与lua代码:print(luat_Test1[1])    
  85.     ReadTableFromIndex(L, "luat_Test2", 2);    
  86.     ReadTableFromIndex(L, "luat_Test2", 3);    
  87.     EnumTableItem(L, "luat_Test2");    
  88.     getchar();  
  89.     return 0;  
  90. }  

ps:配置文件多数以excel转lua的方式配置,网上也有很多相关工具。例如用xlrd:http://blog.csdn.net/five3/article/details/7034826

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值