【问题标题】:Automatic replacement of "\n" by "\\n" in ruby hash [closed]在 ruby​​ 哈希中用“\\n”自动替换“\n”[关闭]
【发布时间】:2013-10-06 12:14:08
【问题描述】:

我正在尝试根据用户提供的输入在 ruby​​ 中构造一个哈希值。但是当我输入一个带有“\n”的字符串时,它会自动替换为哈希值中的双斜杠后跟 n(\ \n) .但我希望数据在哈希中保持原样。下面是我的代码。

puts "Enter the value" 

value = gets.chomp 

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

puts data

【问题讨论】:

    标签: ruby hash


    【解决方案1】:

    这与哈希无关。您根本无法输入\n 作为控制字符(至少不使用gets)。

    如果您作为用户输入\n,则您输入的是文字反斜杠,后跟文字n。这在字符串中表示为"\\n"

    我现在能想到的唯一一个可以直接输入的控制字符是制表符\t(你可以通过输入一个实际的制表符来获得它,而不是\t: p>

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

    【讨论】:

      【解决方案2】:

      您可以让用户结束输入,方法是在空白行上按 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 库,正如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\nbar回车后会产生:

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

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

      【讨论】:

      • 非常感谢.. 效果很好..
      • 太棒了!那么请考虑接受答案,以免它不再显示为未回答。
      猜你喜欢
      • 1970-01-01
      • 2012-10-04
      • 2017-01-16
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 2017-06-09
      相关资源
      最近更新 更多