Замена символа в рубине - PullRequest
0 голосов
/ 24 июня 2009

У меня есть карта, сгенерированная другими с такой структурой данных:

x = {"city": "London", "country": "England", "region": "Europe"}

Я хочу манипулировать данными в Ruby. Поэтому, чтобы Ruby поняла, что это карта, мне нужно заменить все ":" на "=>". Есть ли быстрый способ сделать это в одной строке?

Ответы [ 4 ]

13 голосов
/ 24 июня 2009

вам нужно установить этот драгоценный камень json

sudo gem install json

    require 'json'
    JSON.parse('{"city": "London", "country": "England", "region": "Europe"}')
5 голосов
/ 24 июня 2009
my_text = 'x = {"city": "London", "country": "England", "region": "Europe"}'

# Replace : with =>
ruby_code = t.gsub(':', '=>')

# Evaluate the string as ruby code
eval ruby_code

# Now you can access the hash

x['city'] # => "London"
2 голосов
/ 24 июня 2009
'{"city": "London", "country": "England", "region": "Europe"}'.gsub!(/: /, ' => ')

gsub! выполняет глобальную подстановку на месте.

0 голосов
/ 25 июня 2009

Другой вариант, если вы хотите минимизировать уязвимость до #eval (что рационально), это использовать String#scan:

quoted = /"(?:\\.|[^\\"])*"/
pairs = '{"city": "London", "country": "England", "region": "Europe"}'.scan(/(#{quoted})\s*:\s*(#{quoted})/)
hash = Hash[ *pairs.flatten.map { |q| eval q } ]

Мы все еще используем #eval, но мы знаем, что мы только #eval делаем что-то похожее на строку в кавычках, так что мы в безопасности. Поскольку строки ruby ​​могут содержать произвольный код (посредством чуда интерполяции), мы все еще уязвимы:

# arbitrary code evaluation
p eval('"one two #{puts %{Give me a three!}; gets.chomp} four"')

Самая безопасная альтернатива - полностью обойти #eval и использовать библиотеку для удаления строк без кавычек, которая не позволяет интерполяция. Библиотека JSON (как упоминалось ранее) является отличным примером этого. Это может показаться медленнее (так как это не так оптимизирован, как #eval), но гораздо безопаснее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...