2013-10-06 3 views
-1

Я пытаюсь построить хэш в рубине с ввода, предоставленного пользователем. Но когда я даю строковый ввод с «\ n», это автоматически заменяется двойным слэшем, за которым следует n (\ \ n) в hash. Но я хочу, чтобы данные были такими же, как и в hash.Below - мой код.Автоматическая замена « n» на «\ n» в ruby ​​hash

puts "Enter the value" 

value = gets.chomp 

data = { "test" => "data", "value" => value } 

puts data 

ответ

1

Вы могли бы позволить конечный пользователь ввод, нажав Enter на пустой строке и оставляя остальные линии нетронутым:

puts "Enter the value, then hit ENTER on blank line to finish" 

value = '' 
until (line = gets).chomp.empty? 
    value << line 
end 
value.chomp! 

data = { "test" => "data", "value" => value } 

puts data 

Это, после ввода fooВведитеbarEnterEnter будет производить:

Enter the value, then hit ENTER on blank line to finish 
foo 
bar 

{"test"=>"data", "value"=>"foo\nbar"} 

Единственное ограничение заключается в том, что вы не можете иметь символ новой строки в конце значения.


Другая возможность состоит в том, чтобы «экранирования в» строка после прочтения его от входа с eval. Поскольку eval является потенциально небезопасным, я предпочел бы пойти с yaml библиотеки, как это было предложено в this answer to a related question:

require 'yaml' 

puts "Enter the value" 

line = gets.chomp 
value = YAML.load(%Q(---\n"#{line}"\n)) 

data = { "test" => "data", "value" => value } 

puts data 

Этот, после ввода foo\nbarEnter будет производить:

Enter the value 
foo\nbar 

{"test"=>"data", "value"=>"foo\nbar"} 

Плюс в том, что это может обрабатывать символы новой строки на произвольных позициях.

+0

Большое спасибо .. Он отлично работал .. – NagaLakshmi

+0

Отлично! Тогда, пожалуйста, подумайте о принятии ответа, чтобы он больше не отображался как без ответа. –

2

Это не имеет никакого отношения к хэшу. Вы просто не можете ввести \n в качестве управляющего символа (по крайней мере, не используя gets).

Если в качестве пользователя вы вводите \n, вы набрали буквальную обратную косую черту, за которой следует буква n. Это представлено как "\\n" в строке.

Единственный символ управления я могу думать прямо сейчас, что вы можете вход непосредственно является символ табуляции \t (и вы получите, что, введя фактическую вкладку, не \t:

irb(main):001:0> gets.chomp 
\n 
=> "\\n" 
irb(main):002:0> gets.chomp 
a  b 
=> "a\tb" 
irb(main):003:0> gets.chomp 

=> "" 
Смежные вопросы