Интерполяция переменных среды в строку в Ruby с помощью String # scan - PullRequest
3 голосов
/ 17 марта 2010

Я пытаюсь интерполировать переменные окружения в строку в Ruby и мне не везет. Одно из моих требований - сделать что-то (зарегистрировать ошибку, запросить ввод и т. Д.), Если в начальной строке найден заполнитель, у которого нет соответствующей переменной среды. Похоже, что блочная форма String # scan - это то, что мне нужно. Ниже приведен сеанс 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

Если я использую ENV["FOO"] для ручной интерполяции одного из них, он работает нормально. Я бьюсь головой о стол. Что я делаю не так?

Ruby - это 1.8.1 на RHEL или 1.8.7 на Cygwin.

1 Ответ

4 голосов
/ 17 марта 2010
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> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...