字符串操作和`eval`

时间:2019-03-22 00:15:51

标签: ruby amazon-web-services aws-lambda eval

我有一个AWS lambda函数,它以字符串形式从浏览器接收用户的代码,并像标准REPL一样在沙盒环境中运行eval。我不是要插入字符串。我试图让eval识别并执行字符串操作。

我在执行操作方面受到一定限制。基本的正则表达式替换很酷,但是我认为除了此以外我还不能做更多的事,但也许我弄错了。

这适用于基本算术运算,类实例的创建等。但是,它无法正确执行字符串运算。当我通过时:

eval `("3*4")`

它返回12,这很好。但是,如果我通过:

eval(""str:" + " test"")

它无法返回"str: test"。实际上,它什么也不返回。

有人建议我不要使用双引号。在REPL中,将所有双引号替换为转义的双引号(例如\")即可。

eval("\"str \" + \"test\"") # => "str test"

但是,当我在AWS上尝试使用此方法时,它将返回"\"str \" + \"test\""

希望您能收到答复。

3 个答案:

答案 0 :(得分:1)

您不应该期望eval(""str:" + " test"")能够正常工作。该问题与AWS lambda无关。如果您在自己的计算机上使用pryirb尝试此操作,则会得到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"