2010-03-17 89 views
3

我試圖在Ruby中將環境變量插入到字符串中,但沒有多少運氣。如果在沒有匹配環境變量的初始字符串中找到佔位符,我的一個要求就是做一些事情(記錄錯誤,提示輸入,無論如何)。它看起來像字符串#掃描的塊形式是我需要的。下面是我嘗試失敗的irb會話。使用字符串將環境變量插入到Ruby中的字符串#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。

回答

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> 
+0

啊,哈。萬分感謝。而我認爲那裏的「我的行動」不會成爲一個障礙嗎? – robc 2010-03-17 04:28:42

+0

嗯,它可以是任何表達式,比如方法調用,你可以使用一個方法來接受一個塊......這是一個很酷的Ruby特性,你可以使用單個paren表達式中的語句:'(p'x '; system'echo y'; 234)' – DigitalRoss 2010-03-17 17:17:38