【问题标题】:Why is Ruby ignoring consecutive carriage returns in a heredoc?为什么Ruby会忽略heredoc中的连续回车?
【发布时间】:2014-01-29 16:07:31
【问题描述】:

我使用 heredoc 制作了一些简单的示例数据,例如:

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

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

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

注意三个回车变成两个"\r"s,四个回车变成三个"\r"s。我还尝试了 %q() 语法,结果相同。将相同的数据放入文件中并读取它会生成正确的字符串,其中"\r"s 的数量是正确的。

可能问题与“How can I preserve / maintain consecutive newlines in Ruby here-document?”有关。

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

【问题讨论】:

  • 您需要包含您的 Ruby 版本以及您的运行方式。

标签: ruby string heredoc


【解决方案1】:

这是 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
# >> 
# >> 
# >> 
# >> 

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

【讨论】:

  • am 试图将其作为二进制数据处理,正是因为我试图故意操纵行尾。另外,如果您在响应中实际看到“^M”,我认为您输入的不是正确的——如果您使用CTRL-V CTRL-M 键入它,那么Ruby 将在str.inspect 中向您显示\r .
  • 我正在使用您的示例中的内容,方法是复制和粘贴编辑页面时可见的内容,这是原始来源。如果您正在使用二进制数据,您应该在问题中这么说,因为这是必不可少的。 heredoc 并不真正适合生成二进制数据。 CNTRL-V CNTRL-M 到 "\r" 的转换正是我在源代码中所期望的,因为字符串中的字符是相同的,HEREDOC 就是这样。相反,如果您想保证没有行尾转换,则应使用pack,并在打开文件时使用所需的“b”标志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
相关资源
最近更新 更多