为什么Ruby忽略了heredoc中的连续回车?

时间:2014-01-10 15:45:39

标签: ruby string heredoc

我用heredoc制作了一些简单的样本数据,如:

> str = <<TEXT
  abc^M^M^M
  def^M^M^M^M
TEXT

现在看一下这个字符串的内容:

> p str
"abc\r\r\ndef\r\r\r\n"

请注意,三个回车符变为两个"\r",四个回车符变为三个"\r" s。我也尝试了%q()语法,结果相同。将相同的数据放在一个文件中并读取它会得到一个正确的字符串,其中包含正确数量的"\r" s。

也许这个问题与“How can I preserve / maintain consecutive newlines in Ruby here-document?”有关。

P.S。:使用Ruby 1.8.7-p371,1.9.3-p392和2.0.0-p247,在文件和irb中运行脚本都会发生这种情况。

1 个答案:

答案 0 :(得分:0)

这是Ruby在MacOS系统上看到的内容:

str = <<TEXT
  abc^M^M^M
  def^M^M^M^M
TEXT
str # => "  abc^M^M^M\n  def^M^M^M^M\n"

str = <<TEXT
  abc



  def




TEXT
str # => "  abc\n\n\n\n  def\n\n\n\n\n"

Ruby使用“\ n”表示行尾,如果我没记错的话,可以在内部进行转换。 Ruby知道各种操作系统所需的行末端,并在读取/写入文本文件时尝试转换为该行,因此在文件I / O期间可能会发生转换。

str = <<TEXT
  abc\n\n\n
  def\n\n\n\n
TEXT
str # => "  abc\n\n\n\n  def\n\n\n\n\n"
puts str
# >>   abc
# >> 
# >> 
# >> 
# >>   def
# >> 
# >> 
# >> 
# >> 

如果使用IO,File作为“文本”文件或str在Windows上输出最后一个puts,Ruby应输出正确的行尾,将LF字符转换为CRLF组合。换句话说,除非你正在编写二进制数据,否则你不必跳过箍来输出特定于操作系统或文件类型的行末端。