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

时间:2010-03-17 03:51:34

标签: ruby string

我正在尝试将环境变量插入到Ruby中的字符串中而没有太多运气。如果在没有匹配环境变量的初始字符串中找到占位符,我的一个要求是执行某些操作(记录错误,提示输入,等等)。看起来像String#scan的块形式是我需要的。以下是我尝试失败的一段时间。

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

如果我使用ENV["FOO"]手动插入其中一个,它可以正常工作。我正在敲打桌子。我做错了什么?

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

1 个答案:

答案 0 :(得分:4)

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>