我是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)
那么有人可以解释我应该如何执行局部变量外部参数的赋值?
答案 0 :(得分:1)
redis eval命令只是将输入拆分为标记,因此您的参数0
是string
,而不是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块没有返回任何内容。