Ruby 如何处理反斜杠\&引用;q字符串中的转义字符和heredocument

Ruby 如何处理反斜杠\&引用;q字符串中的转义字符和heredocument,ruby,Ruby,我是鲁比新手。我不明白为什么Ruby会在%q中查找,然后转义\ 我正在使用Ruby生成Latex代码。我需要生成\\\hline,它在Latex中用于制表。我发现\\\hline作为输入生成\hline,即使字符串在%q中 这里是MWE #!/usr/local/bin/ruby -w tmp = File.open('foo.txt','w') str = %q[\\\hline] tmp.write(str) tmp.close 文件foo.txt包含以下内容 \\hline 鲁比确实

我是鲁比新手。我不明白为什么Ruby会在
%q
中查找,然后转义
\

我正在使用Ruby生成Latex代码。我需要生成
\\\hline
,它在Latex中用于制表。我发现
\\\hline
作为输入生成
\hline
,即使字符串在
%q

这里是MWE

#!/usr/local/bin/ruby -w
tmp = File.open('foo.txt','w')
str = %q[\\\hline]
tmp.write(str)
tmp.close
文件
foo.txt
包含以下内容

 \\hline
鲁比确实给出了警告

   warning: encountered \r in middle of line, treated as a mere space
但这不应该生成,因为这应该是转义字符串

现在我用Python多行原始字符串(类似于Ruby的
%q

并且该文件再次按预期包含
\\\hline

我在Ruby上做错什么了吗

ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [i686-linux]

%q
%q
分别是单引号和双引号字符串的替代品。它们通常在字符串本身包含引号时使用(HTML是一个典型的例子),因此这是为了避免嘈杂的引号转义

单引号字符串不提供字符串插值和转义。除了两个例外:单引号和反斜杠本身。在
%q
字符串中,不需要转义引号,但需要转义反斜杠

puts %q[\\\\\\hline 'some words']

# >> \\\hline 'some words'

更奇特的是使用哈希进行插值:

str = <<'TEXT'
hello %{name}
\\\hline
%{msg}, %{name}
TEXT

puts str % {name: "Graig", msg: "Goodbye"}

谢谢这意味着%q和%q对我来说没有用处。所以我唯一的选择就是使用EOT?但这也不会像你所看到的那样取代“\”?当然,我不想每次都手动转义'\'。我正在寻找与Perl或Python类似的行为。我担心ruby中的所有字符串类型都会转义反斜杠。您可以做的是将内容存储在纯文本文件中。这样就不会重复反斜杠,ruby将在加载文件时处理转义。或者您可以只使用Perl:trollface:OK,谢谢您的确认。这对我来说不是好消息。我尝试Ruby的唯一原因是为了产生乳胶,乳胶里有很多东西。我对此感到惊讶。好的,现在我将回到Perl(直到我找到更好的;)@SergioTulentsev,Ruby编程语言p。52,关于heredocs:“如果你想非常非常文字化,不允许任何转义字符,请将分隔符放在单引号中。”OP的heredoc示例实际上适用于meThe。当我运行代码段时,foo2.txt文件包含“\\\hline”ẅ对于HEREDOC
str=@steenslag,你是对的,很抱歉,我一定是把它和其他测试的另一个文件混在一起了。将从问题中删除这一部分。但是herdeoc解决方案不适合我想要的。我更喜欢使用
%q
,因为我需要能够通过追加较小的字符串来构建较大的字符串,而由于缩进的原因,使用herdoc使这一点非常困难。Python
r“”“实际上对我想要的效果最好,因为它处理所有的反斜杠,并且允许我在中间使用附加或插入字符串,而不需要使用SigOcWOW的情况下需要任何特殊的缩进!谢谢,这正是我想要的。我一直在想如何做到这一点,但我不知道有这样使用
%s
的技巧。我相信塞尔吉奥不会介意我接受你的回答,因为这正是我想要的。再次感谢。我现在将继续使用Ruby:)好吧,你的解决方案很好,但它并不适用于我所有的情况:(,我的字符串中有
%
。下面是一个示例:
str=我甚至无法在“100%”字符串中转义“%”。我尝试了“100\%”但是它仍然不起作用。嗯……这有点麻烦了,但是你可以在herdoc中用%{p}之类的东西替换%并将
p:“%”
添加到哈希中。
str = <<'TEXT'
hello %s
\\\hline
%s
TEXT

name = "Graig"
msg = "Goodbye"
puts str % [name, msg]
hello Graig
\\\hline
Goodbye
str = <<'TEXT'
hello %{name}
\\\hline
%{msg}, %{name}
TEXT

puts str % {name: "Graig", msg: "Goodbye"}
hello Graig
\\\hline
Goodbye, Graig