我有一个AWS lambda函数,它以字符串形式从浏览器接收用户的代码,并像标准REPL一样在沙盒环境中运行eval
。我不是要插入字符串。我试图让eval
识别并执行字符串操作。
我在执行操作方面受到一定限制。基本的正则表达式替换很酷,但是我认为除了此以外我还不能做更多的事,但也许我弄错了。
这适用于基本算术运算,类实例的创建等。但是,它无法正确执行字符串运算。当我通过时:
eval `("3*4")`
它返回12
,这很好。但是,如果我通过:
eval(""str:" + " test"")
它无法返回"str: test"
。实际上,它什么也不返回。
有人建议我不要使用双引号。在REPL中,将所有双引号替换为转义的双引号(例如\"
)即可。
eval("\"str \" + \"test\"") # => "str test"
但是,当我在AWS上尝试使用此方法时,它将返回"\"str \" + \"test\""
。
希望您能收到答复。
答案 0 :(得分:1)
您不应该期望eval(""str:" + " test"")
能够正常工作。该问题与AWS lambda无关。如果您在自己的计算机上使用pry
或irb
尝试此操作,则会得到SyntaxError
。这是因为您的解释器无法理解您仅将一个统一的字符串传递给eval。因此,您需要在字符串中转义所有引号:
eval("\"str \" + \"test\"")
如果您已在REPL中进行了转义而未进行转义测试,并且它起作用了,则似乎您正在使用的REPL会以某种方式更改您的输入,然后再将其发送给解释器。
答案 1 :(得分:1)
我似乎找到了解决方法。
首先,我将首先澄清我的问题。假设用户输入了以下内容:
class Test
attr_accesssor :data
def initialize(data = nil)
@data = data
end
end
之后
Test.new(4).data
eval
将正确返回4。
现在,请说用户写了
Test.new("A nice, fine string").data
eval
将不返回任何内容。
但是,我注意到,如果我踩到.inspect
,如下所示:
Test.new("A nice, fine string").data.inspect
我将返回A nice, fine string
。
所以我的解决方案是将用户代码的全部内容括在括号中,然后调用.inspect
。
通过以下行完成
code = "(" << code << ").inspect"
感谢所有花时间帮助我的人。我非常感谢所有反馈和建议。
答案 2 :(得分:0)
在字符串上使用eval时,请注意字符串内插:
str = %(This is my String. It's name is string. Now I can eval "Hooray for my string")
eval(str.inspect)
#=> "This is my String. It's name is string. Now I can eval \"Hooray for my string\""
但是这些都会引发错误
eval(str)
#=> SyntaxError: (eval):1: unterminated string meets end of file
eval(puts str) # will output the string but raise an error after it.
#=> This is my String. It's name is string. Now I can eval "Hooray for my string"
# TypeError: no implicit conversion of nil into String
但这会起作用
eval("puts #{str.inspect}")
#=> This is my String. It's name is string. Now I can eval "Hooray for my string"