The output for the below script is:
AD[1] = [variable not found]
AD['2'] = bar
How can I modify the function getfield to return a value for v for both cases?
function getfield (f)
local v = _G
for w in string.gfind(f, "[%w_]+") do
v = v[w]
end
return v
end
AD = {[1] = 'foo', ['2'] = 'bar'}
data = {"AD[1]","AD['2']"}
for i,line in ipairs(data) do
s = getfield(line)
if s then
print(line .. " = " .. s)
else
print(line .. " = [variable not found]")
end
end
UPDATE:
I’m 90% sure, this is going to work for me:
function getfield (f)
local v = _G
for w in string.gfind(f, "['%w_]+") do
if (string.find(w,"['%a_]")==nil) then
w = loadstring('return '..w)()
else
w = string.gsub(w, "'", "")
end
v=v[w]
end
return v
end
This happens to work
but it’s pretty fragile.
Note that I added
'to the pattern.The difficulty is that sometimes w is a string representing a name (key), and sometimes it’s a string representing a number. In the second case it needs to be converted from string to number. But you need the context or some syntax to decide.
Here’s the kind of fragility I mean:
math[pi]is unchanged, butgetfieldinterprets pi in the global context and gets3so the wrong field ofmathis returned.