脚本语言Lua小试(安装及简单语法)

来源:互联网 发布:淘宝淘客微信群推广 编辑:程序博客网 时间:2024/05/16 06:40

学习之余浏览一下大神陈皓的酷壳网,不经意看到这篇《Lua简明教程》,于是想尝试一下这个很轻量级的脚本,也号称性能最高的脚本语言。

一、Lua 语言简介

Lua英语发音:/ˈlə/程序设计语言是一个简洁、轻量、可扩展的脚本语言,是葡萄牙语中“Luna”(月亮)的意思。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发(已经有20多个年头咯)。 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。

Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。[1]


二、Lua 安装

网上搜了一下,好像sudo apt-get、install lua5.2就可以。

我是在Lua官网下载安装包安装的(我下载的lua-5.2.3.tar.gz):

1. tar -xvf lua-5.2.3.tar.gz cd lua-5.2.3 进入目录
long@zhouyl:~/Public/lua-5.2.3$ ls
       doc  Makefile  README  src
很明显,Linuxer在看到README的情况下毋庸置疑的要看一下:
long@zhouyl:~/Public/lua-5.2.3$ cat README

This is Lua 5.2.3, released on 11 Nov 2013.

For installation instructions, license details, and
further information about Lua, see doc/readme.html.
这个README写的很简单,没有我们预想的那样写了如何安装或者如何使用等,但是它写明了想要学习Lua的更多信息,查看doc/readme.html文件,所以……  chromium-browser doc/readme.html打开看看呗。不出所料,打开的网页中有着About / Installing / Changes ...,所以我们略读一遍就能知道如何安装。


2. make linux (这里make后跟着平台,我们当然要跟着linux咯)
不幸的是……报错了:“ error:readline/readline.h:no such file or directory ”
之前的博客中,我写过使用apt-file查询这种缺失文件的方法,有兴趣可以看看《cyclictest 测试以及原理浅谈》一文,在其中有详细的apt-file使用。
apt-file search readline | grep readline.h
可以很轻松地在结果中找到这条:
“ libreadline6-dev: /usr/include/readline/readline.h ”,所以apt-get安装之(sudo apt-get install libreadline6-dev)!

安装完成后,再使用 make linux 非常顺利!


3. sudo make install
此时,Lua已经安装完毕,我们可以使用这个神奇的脚本语言Lua了:
long@zhouyl:~/Public/lua-5.2.3$ lua
Lua 5.2.3  Copyright (C) 1994-2013 Lua.org, PUC-Rio
> print("Hello World")
Hello World
>

作为一个脚本语言,它当然也可以写到脚本文件中运行:

long@zhouyl:/tmp/test$ cat hello.lua
#!/usr/local/bin/lua
print("Hello World")
long@zhouyl:/tmp/test$ lua hello.lua 
Hello World
long@zhouyl:/tmp/test$ chmod +x hello.lua 
long@zhouyl:/tmp/test$ ./hello.lua 
Hello World
long@zhouyl:/tmp/test$ 


三、Lua 语言基础

3.1 注释

-- 两个横线开始单行注释


--[[ 
     加上两个[和]表示

   多行注释

--]]

3.2 变量类型

Lua是一种动态类型语言,因此语言中没有类型的定义,不需要声明变量类型,每个变量自己保存了类型。Lua有八种基本类型:

数值(number)        内部以double表示,Lua的数字只有double型,64bits,你不必担心Lua处理浮点数会慢(除非大于100,000,000,000,000),或是会有精度问题
字符串(string)       总是以零结尾,但可以包含任意字符(包括零),因此并不等价于C字符串,而是其超集。字符串你可以用单引号,也可以用双引号或者上面注释时用到的[[ ]](类似于Python中的三引号,可以用于定义多行的字符串),还支持C类型的转义,比如: ‘\a’ (响铃), ‘\b’ (退格), ‘\f’ (表单), ‘\n’ (换行)>, ‘\r’ (回车), ‘\t’ (横向制表), ‘\v’ (纵向制表), ‘\\’ (反斜杠), ‘\”‘ (双引号), 以及 ‘\” (单引号)
布尔(boolean)       只有“true”或者“false”两个值。数字0、''空字符串('\0')都是true!
函数(function)       Lua的关键概念之一。不简单等同于C的函数或函数指针。
表(table)                异构的Hash表。Lua的关键概念之一。
userdata                用户(非脚本用户)定义的C数据结构。脚本用户只能使用它,不能定义。
线程(thread)          Lua协作线程(coroutine),与一般操作系统的抢占式线程不一样。
nil                            代表什么也没有,可以与C的NULL作类比,但它不是空指针。你访问一个没有声明过的变量,就是nil。例如 foo = anUnknownVariable  现在 foo = nil。 只有false和nil是false,其他的都是true,上面提到过包括0和空字符串在内都是true。

> print(type(nil))nil> print(type(99.9+12))number> print(type(true))boolean> print(type("Hello World"))string> print(type(print))function> print(type{test = "test"})table
要注意的是:lua中的变量如果没有特殊说明,全是全局变量,那怕是语句块或是函数里。变量前加local关键字的是局部变量
theGlobalVar = 50
local theLocalVar = "local variable"

3.3 流控制

Lua中使用do和end等关键字标示出程序块: 

while 循环

while num < 50 do   num = num + 1  -- 没有 ++ or += 运算符。 end 

If 语句: 
if num > 40 then        print('over 40')elseif    s ~= 'walternate' then  -- ~= 表示不等于。像Python一样,== 表示等于,适用于字符串。         io.write('not over 40\n')  -- 默认输出到stdout。   else         -- 默认变量都是全局的。        thisIsGlobal = 5  -- 通常用驼峰式定义变量名。        -- 如何定义局部变量:        local line = io.read()  -- 读取stdin的下一行。        -- ..操作符用于连接字符串:        print('Winter is coming, ' .. line)end 

and 和 or

Lua中的'or'和 'and'都是可短路的,和python中一样, 我们也可以使用 a and b or c 得到类似于C/js里的 a?b:c 操作符: 

ans = aBoolValue and 'yes' or 'no'  

for 循环

karlSum = 0 for i = 1, 100 do  -- 范围包括两端       karlSum = karlSum + i end -- 使用 "100, 1, -1" 表示递减的范围: fredSum = 0 for j = 100, 1, -1 do fredSum = fredSum + j end 

范围表达式为begin, end[, step]。类似于python中的range()。

until 循环: 
repeat         print('the way of the future')         num = num - 1 until num == 0 

3.4 函数

Lua的函数定义同shell中类似,使用function关键字,end结束:

递归

function fib(n)  if n < 2 then return 1 end  return fib(n - 2) + fib(n - 1)end


闭包
示例一
function newCounter()    local i = 0    return function()     -- anonymous function        i = i + 1        return i    endend c1 = newCounter()print(c1())  --> 1print(c1())  --> 2

示例二
function myPower(x)    return function(y) return y^x endend power2 = myPower(2)power3 = myPower(3) print(power2(4)) --4的2次方print(power3(5)) --5的3次方

Lua 语言支持多值同时赋值:name,Age = "Zhou",12,所以Lua的函数返回值也多返回值(同python挺像):

#!/usr/local/bin/luafunction getUserInfo(id)    print(id)    return "Zhou", 24endname, age = getUserInfo()   -- 使用多个变量接收函数返回值print(name)print(age)print(getUserInfo(123))     -- 直接打印函数的多个返回值print(getUserInfo(123)[1])  -- 尝试一下是否支持python式的使用数组方式选择返回值的部分
程序写的很简单,那么运行结果如何?

long@zhouyl:/tmp$ lua aa.lua nil           -- 没有带参数,打印id时打印空Zhou  24123         -- 打印idZhou24       -- 输出多返回值123         nil            -- 并不支持选取返回值的部分,所以还是乖乖用变量接收返回值比较好

3.5 Table

所谓Table其实就是一个Key Value的数据结构,就像python或者其他语言中的Dict(字典),Table是Lua中的唯一的数据结构:

long@zhouyl:~$ luaLua 5.2.3  Copyright (C) 1994-2013 Lua.org, PUC-Rio> zhou = {name="Zhou Yunlong",age=24,home="AH"}> print(zhou.name)  -- 通过key打印valueZhou Yunlong> zhou.hope="gf"    -- 可以直接添加> print(zhou.hope)gf> for key,value in pairs(zhou) do   -- 遍历Table  print(key,value)endhope    gfage 24name    Zhou Yunlonghome    AH> 


四、说在最后的话

本文只是在看到陈皓大神的博文后,对Lua脚本语言的一些简单测试,感觉还挺有意思的,这个神奇、简单、高效的语言也走过了20多个年头。

但是Lua与python不同的是,python有着庞大丰富的库,而Lua的库并不多,所以Lua一般用来作为一种嵌入式脚本语言,使用过Lua的项目(很多游戏中使用到)也是令人瞩目,包括伟大的魔兽世界的插件中也是使用到Lua。但是本文只做了一些简单的语言规则的描述,以后如果有时间还是看看这门神奇的语言。下面贴出一些在网上学习Lua的好资源,如果你有兴趣,不妨玩玩?!


================

引用:

[1] http://baike.baidu.com/link?url=zG3bYWFojdkaOefWrkPZFH9TkBIOmQqSDtuD9YgzwBx_h6eeGKsJx3brHfPrwvpL

[2] http://coolshell.cn/articles/10739.html 

[3] http://tylerneylon.com/a/learn-lua/

更多学习:

  • manual.luaer.cn lua在线手册
  • book.luaer.cn lua在线lua学习教程
  • lua参考手册Lua参考手册的中文翻译(云风翻译版本)
  • LUA编程(programming in lua中文版)
  • http://www.codingnow.com/2000/download/lua_manual.html    Lua 5.1 中文手册。
  • http://lua-users.org/   可以得到大量的关于 lua 的信息。
  • http://www.lua.org/lua-l-stats.html   这里可以用 web 访问到 lua 的 maillist ,但是如果想好好用 Lua ,还是订阅一份比较好。 
  • http://luaforge.net/projects/      大量的 Lua 相关的项目可以参考。并不是所有的项目都值得直接拿来用的,尽管 Lua 5.1 已经发布了官方的 module 扩展方案。不过许多 source code 是值得借鉴的。 
  • http://benchmarksgame.alioth.debian.org/u32/benchmark.php?test=all&lang=lua&lang2=lua  我们可以从这里得到许多高性能的 lua 代码,从中了解如何写出高质量的 lua 程序。
  • http://luajit.org/    Lua JIT 绝对值得关注的东西。  
  • http://www.keplerproject.org/     用 lua 实现的一个 web 解决方案,算是一个巨大的基于 lua 的工程了。
  • http://www.codingnow.com/2000/download/The%20Implementation%20of%20Lua5.0.pdf    The Implementation of Lua 5.0 中译(向海飞 译)

关于Lua的标库,你可以看看官方文档:string,  table, math, io, os。


 


0 0
原创粉丝点击