使用eval命令在Lua脚本中进行局部变量赋值

时间:2013-12-19 11:49:23

标签: lua eval

我是lua脚本的初学者。我尝试在redis客户端

中执行以下命令
eval "print('hello world')" 0

它可以很好地归还我

hello
(nil)    

首先,我不明白为什么nil会被返回/被打印?是因为red-datatype inter-conversion的lua-datatype返回nil ??

然后我使用if构造并执行以下脚本

eval "local t = 0; if t == 0 then print('hello'); end" 0 0

以上命令按预期打印

hello
(nil)

但是当我尝试使用下面的代码

将参数分配给局部变量时
eval "local t = ARGV[1]; if t == 0 then print('hello'); end" 0 0

输出只是

(nil)

那么有人可以解释我应该如何执行局部变量外部参数的赋值?

2 个答案:

答案 0 :(得分:1)

redis eval命令只是将输入拆分为标记,因此您的参数0string,而不是number

但是,Lua中的比较0 == "0"是错误的,因此您需要做的是更改为其中任何一种变体:

eval "local t = ARGV[1]; if t == '0' then print('hello'); end" 0 0
eval "local t = ARGV[1]; if tonumber(t) == 0 then print('hello'); end" 0 0

注意:以上是Kamiccolo提到的那种;请注意,在Lua的eval中,您永远无法访问eval外部的local变量,因为代码总是在 global 上下文中进行评估!

答案 1 :(得分:0)

根据Redis EVAL documentation,禁用使用chunk执行的eval()到全局变量的全局变量访问。它没有被提及,但我怀疑访问local是更大的违规和可能的泄漏。因此,您应该遵循官方文档并使用Redis keys代替。或者,当然,重新使用返回的valies。

来自eval()文档的相关块:

  

全局变量保护

     

不允许Redis脚本创建全局变量,以避免数据泄漏到Lua状态。如果脚本需要在调用之间保持状态(非常罕见的需要),则应该使用Redis键。

刚才意识到,这个问题的主题与问题的标题不符,所以重新开始...

正确eval()用法(来自Redis文档):

  

EVAL的第一个参数是Lua 5.1脚本。该脚本不需要定义Lua函数(也不应该)。它只是一个将在Redis服务器上下文中运行的Lua程序。

     

EVAL的第二个参数是脚本之后的参数数(从第三个参数开始),表示Redis键名。 Lua可以使用基于一个数组的形式的KEYS全局变量来访问这些参数(所以KEYS [1],KEYS [2],......)。

     

所有其他参数不应代表关键名称,Lua可以使用ARGV全局变量访问,非常类似于键(所以ARGV [1],ARGV [2],...)。

在您的示例中您正在设置0的参数数量,因此,没有任何内容传递给您的Lua脚本。快速修复:

eval "local t = ARGV[1]; if t == 0 then print('hello'); end" 1 0

不确定nil,但这可能只是因为你提供的Lua块没有返回任何内容。