使用string#scan在Ruby中将环境变量插入到字符串中

使用string#scan在Ruby中将环境变量插入到字符串中,ruby,string,Ruby,String,我试图在Ruby中将环境变量插入到字符串中,但运气不太好。我的要求之一是,如果在没有匹配环境变量的初始字符串中找到占位符,则执行某些操作(记录错误、提示输入等等)。看起来我需要的是块形式的字符串扫描。下面是我失败尝试的irb会话 irb(main):014:0> raw_string = "need to replace %%FOO%% and %%BAR%% in here" => "need to replace %%FOO%% and %%BAR%% in here" irb(

我试图在Ruby中将环境变量插入到字符串中,但运气不太好。我的要求之一是,如果在没有匹配环境变量的初始字符串中找到占位符,则执行某些操作(记录错误、提示输入等等)。看起来我需要的是块形式的字符串扫描。下面是我失败尝试的irb会话

irb(main):014:0> raw_string = "need to replace %%FOO%% and %%BAR%% in here"
=> "need to replace %%FOO%% and %%BAR%% in here"
irb(main):015:0> cooked_string << raw_string
=> "need to replace %%FOO%% and %%BAR%% in here"
irb(main):016:0> raw_string.scan(/%%(.*?)%%/) do |var|
irb(main):017:1* cooked_string.sub!("%%#{var}%%", ENV[var])
irb(main):018:1> done
irb(main):019:1> end
TypeError: cannot convert Array into String
    from (irb):17:in `[]'
    from (irb):17
    from (irb):16:in `scan'
    from (irb):16
    from :0
irb(main):014:0>raw\u string=“需要在此处替换%%FOO%%和%%BAR%%”
=>“需要在此处替换%%FOO%%和%%BAR%%”
irb(主):015:0>烹饪字符串“需要在此处替换%%FOO%%和%%BAR%%”
irb(主):016:0>原始字符串。扫描(/%(.*?)%%/)do | var|
irb(主):017:1*cooked_string.sub!(“%#{var}%%”,ENV[var])
irb(主):018:1>完成
irb(主):019:1>结束
TypeError:无法将数组转换为字符串
from(irb):17:in`[]'
来自(irb):17
发件人(irb):16:in'scan'
起始(irb):16
起:0
如果我使用
ENV[“FOO”]
手动插值其中的一个,效果很好。我的头撞在桌子上。我做错了什么

Ruby在RHEL上是1.8.1,在Cygwin上是1.8.7

irb(main):018:0> "how %%EDITOR%% now %%HOME%% brown cow".gsub(/%%.*?%%/) do |e|
irb(main):019:1*   ENV[e.gsub '%', '']
irb(main):020:1> end
=> "how vi now /Users/ross brown cow"
稍有不同,并结合您的默认操作

irb(main):045:0> "how %%EDITOR%% now %%HOME%% brown %%X%% cow".gsub(/%%(.*?)%%/) do |e|
irb(main):046:1*   t = ENV[$1]
irb(main):047:1>   t.nil? ? "my action" : t
irb(main):048:1> end
=> "how vi now /Users/ross brown my action cow"
irb(main):049:0> 

啊哈。太好了,谢谢。我认为“我的动作”是一个块是没有问题的?它可以是任何表达式,比如方法调用,你可以使用一个接受块的方法。。。这里有一个很酷的Ruby特性,您可以使用单个paren表达式中的语句:
(p'x';system'echo y';234)