-1

我正在尝试根据用户提供的输入在 ruby​​ 中构造一个散列。但是当我用“\n”输入字符串时,它会自动替换为双斜杠,然后是散列中的 n(\\n)。但是我希望数据与哈希中的数据相同。下面是我的代码。

puts "Enter the value" 

value = gets.chomp 

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

puts data
4

2 回答 2

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

=> ""
于 2013-10-06T12:20:35.577 回答
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

这个,进入后fooEnterbarEnterEnter会产生:

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

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

唯一的限制是值的末尾不能有换行符。


另一种可能性是在从输入中读取字符串后“取消转义”字符串eval。由于eval可能不安全,我宁愿去yaml图书馆,正如对相关问题的回答中所建议的那样:

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"}

优点是它可以处理任意位置的换行符。

于 2013-10-06T13:22:50.797 回答