我用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
中运行脚本都会发生这种情况。
答案 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组合。换句话说,除非你正在编写二进制数据,否则你不必跳过箍来输出特定于操作系统或文件类型的行末端。