为什么Ruby会忽略heredoc中的连续回车?
我使用了一个heredoc来生成一些简单的示例数据,如:为什么Ruby会忽略heredoc中的连续回车?,ruby,string,heredoc,Ruby,String,Heredoc,我使用了一个heredoc来生成一些简单的示例数据,如: > str = <<TEXT abc^M^M^M def^M^M^M^M TEXT 注意三个回车变成两个“\r”s,四个回车变成三个“\r”s。我还尝试了%q()语法,得到了相同的结果。将相同的数据放入一个文件并读取它会产生一个正确的字符串,其编号为“\r”s 这个问题可能与“”有关 注意:在文件中运行脚本和在irb中使用Ruby 1.8.7-p371、1.9.3-p392和2.0.0-p247都会发生这种情况
> str = <<TEXT
abc^M^M^M
def^M^M^M^M
TEXT
注意三个回车变成两个“\r”
s,四个回车变成三个“\r”
s。我还尝试了%q()
语法,得到了相同的结果。将相同的数据放入一个文件并读取它会产生一个正确的字符串,其编号为“\r”s
这个问题可能与“”有关
注意:在文件中运行脚本和在
irb
中使用Ruby 1.8.7-p371、1.9.3-p392和2.0.0-p247都会发生这种情况 以下是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"
str=>
# >>
# >>
#>>def
# >>
# >>
# >>
# >>
如果在Windows上使用IO、文件作为“文本”文件或puts输出最后一个
str
,Ruby应输出正确的行尾,将LF字符转换为CRLF组合。换句话说,除非您正在编写二进制数据,否则您不必跳转到特定于操作系统或文件类型的输出行尾。您需要包括您的Ruby版本以及如何运行它。我正试图将其作为二进制数据处理,正是因为我试图故意操纵行尾。此外,如果您在响应中实际看到“^M”,我认为您输入的内容不正确--如果您使用CTRL-V
CTRL-M
键入,Ruby将在str.inspect
中显示\r
。我正在使用您的示例中的内容,通过复制和粘贴编辑页面时可见的内容,这是原始来源。如果您使用的是二进制数据,您应该在问题中这样说,因为这是必不可少的。heredoc实际上不适合生成二进制数据。CNTRL-V CNTRL-M到“\r”
的转换正是我在源代码中所期望的,因为字符串中的字符是相同的,而herdoc是相同的。相反,如果要保证不进行行尾转换,则应使用pack
,并在打开文件时使用所需的“b”标志。
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"
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
# >>
# >>
# >>
# >>