使用eval命令在Lua脚本中指定局部变量
我是lua脚本的初学者。我尝试在redis客户端中执行以下命令使用eval命令在Lua脚本中指定局部变量,lua,eval,Lua,Eval,我是lua脚本的初学者。我尝试在redis客户端中执行以下命令 eval "print('hello world')" 0 而且还我很好 hello (nil) 首先,我不明白为什么nil总是被退回/打印??是因为lua数据类型到redis数据类型的相互转换返回零吗 然后我使用if构造并执行下面的脚本 eval "local t = 0; if t == 0 then print('hello'); end" 0 0 上述命令按预期打印 hello (nil) 但是当我尝试使用下
eval "print('hello world')" 0
而且还我很好
hello
(nil)
首先,我不明白为什么nil总是被退回/打印??是因为lua数据类型到redis数据类型的相互转换返回零吗
然后我使用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)
那么,有人能解释一下如何将外部参数赋值给局部变量吗?根据,使用eval()
执行的chunk
全局变量访问被禁用。虽然没有提到,但我怀疑访问本地的
文件是更大的违规行为和可能的泄漏。因此,您应该遵循官方文档,改用Redis-keys
。当然,也可以重复使用退回的旅行箱
eval()
文档中的相关区块:
全局变量保护
不允许Redis脚本创建全局变量,以避免数据泄漏到Lua状态。如果脚本需要在调用之间保持状态(这是一种非常罕见的需要),那么它应该使用Redis键
刚意识到,该问题的主体与问题的标题不匹配,因此重新开始
正确的eval()
用法(来自Redis文档):
EVAL的第一个参数是lua5.1脚本。脚本不需要定义Lua函数(也不应该定义)。它只是一个Lua程序,将在Redis服务器的上下文中运行
EVAL的第二个参数是脚本后面(从第三个参数开始)表示Redis键名的参数数。Lua可以使用KEYS全局变量以基于一个数组的形式访问这些参数(因此KEYS[1]、KEYS[2]、…)
所有附加参数都不应表示键名,并且可以由Lua使用ARGV全局变量访问,这与键的情况非常类似(因此ARGV[1]、ARGV[2]、…)
在您的示例中,您将参数的数量设置为0
,因此,不会向Lua脚本传递任何内容。快速修复:
eval“本地t=ARGV[1];如果t==0,则打印('hello');结束“10
不确定
nil
,但这可能是因为您提供的Lua块没有返回任何内容。redis eval命令只不过是将您的输入拆分为标记,因此您的参数0
是字符串
,而不是数字
但是,在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提到了is;请注意,在Lua的eval中,您永远无法从eval外部访问本地
变量,因为代码总是在全局上下文中进行计算 @Kamiccola:“EVAL的第二个参数是脚本后面(从第三个参数开始)表示Redis键名的参数数。”它应该是0,因为我没有向它传递任何键名,我尝试了你所说的,但它不起作用!您能否尝试eval“print('arg[1]是',ARGV[1])”0 123
查看它是否打印123?你看过吗?