2013-08-26 41 views
-1

我从一个CSV文件中提取下面的字符串,从单元格A1,并把它作为一个变量:阅读字符串变量RUBY

#{collector_id} 

因此,单元格A1读取#{collector_id},和我的代码基本上做到这一点:

test = #excel_cell_A1 

但是,如果我再这样做:

puts test 

我得到这个:

#{collector_id} 

我需要#{collector_id}改为实际变量collector_id,而不是代码,我使用调用变量。那可能吗?

感谢您的帮助。我正在使用红宝石1.9.3。

+1

这没什么意义。我们需要看到至少被Ruby解释器接受的实际代码。请参阅http://sscce.org/ –

回答

1

进行评估,您可以使用subgsub以替换预期输入值:

collector_id = "foo" 
test = '#{collector_id}' 
test.sub("\#{collector_id}", "#{collector_id}") #=> "foo" 

我会避免使用eval(或至少理智地检查您正在运行的程序)以降低运行从CSV文件接收的任意代码的风险。

+0

很好的建议。我认为这足够了,我可以避免使用'eval'作为最佳实践。 – Luigi

0

试试这个:

test_to_s = eval("\"#{ test }\"") 
puts test_to_s 

%q["#{ test }"]将建成串"#{collector_id}"(双引号是字符串的一部分,"#{collector_id}".length == 17),然后将作为Ruby代码通过eval

+1

永远不要在用户提供的数据上使用'eval'。您刚刚创建了一个很好的远程代码执行漏洞(这是最糟糕的安全问题之一)。 –

+0

我同意安全问题 - 幸运的是,对于我的特殊情况,我的团队将创建我从中提取的csv文件。它基本上是电子邮件的内容文件。 – Luigi