2013-12-19 28 views
2

我是lua腳本的初學者。我試着在Redis的客戶使用eval命令在Lua腳本中進行局部變量賦值

eval "print('hello world')" 0 

執行下面的命令,它工作正常返回我

hello 
(nil)  

首先,我不明白爲什麼不返回/被永遠印在零?是因爲lua-datatype到redis-datatype轉換器返回nil ??

然後我用如果構建體和執行的以下腳本

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

你可以嘗試'eval「print('arg [1] is',ARGV [1])」0 123'看看它是否打印123?你有沒有看過http://redis.io/commands/EVAL? – Schollii

回答

1

redis eval命令只不過是將您的輸入分割爲標記,因此您的參數0string,而不是number

然而,比較0 == "0"是在Lua假的,所以你需要做的是改變其中的任一變體:

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外部的local變量,因爲始終在全局上下文中評估代碼!

0

根據Redis EVAL documentation,將從chunk執行的全局變量從eval()全局變量中禁用。這沒有提及,但我懷疑訪問local甚至更​​大的違規和可能的泄漏。因此,您應該遵循官方文檔並改用Redis keys。或者,當然,重新使用返回的valies。

eval()文檔相關大塊:

全局變量保護

Redis的腳本不允許創建全局變量,以避免數據泄露到Lua的狀態。如果腳本需要在調用之間保持狀態(非常罕見),應該使用Redis鍵代替。

剛剛意識到,這個問題的身體不匹配問題的標題,所以重新開始......

正確eval()使用(從Redis的文檔):

EVAL的第一個參數是一個Lua 5.1腳本。腳本不需要定義一個Lua函數(不應該)。這只是一個Lua程序,它將在Redis服務器的上下文中運行。

EVAL的第二個參數是參數個數,它遵循表示Redis鍵名的腳本(從第三個參數開始)。這個參數可以通過使用基於一個數組的KEYS全局變量(如KEYS [1],KEYS [2],...)由Lua訪問。

所有附加參數都不應該表示鍵名,並且可以通過使用ARGV全局變量的Lua來訪問,非常類似於鍵(ARGV [1],ARGV [2],...)發生的情況。

在您的示例中您將參數的數量設置爲0,因此沒有任何內容傳遞給您的Lua腳本。快速修復:

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

不確定nil,但可能是因爲剛剛您提供的Lua塊不返回anyhing。

+0

@Kamiccola:「EVAL的第二個參數是腳本後面的參數個數(從第三個參數開始),代表Redis鍵名。」它應該是0,因爲我沒有傳遞任何關鍵字,我嘗試了你所說的,但它不起作用! –