如何处理q字符串和heredocument中的反斜杠“\”转义字符

时间:2015-06-23 09:12:11

标签: ruby

Ruby新手在这里。我不明白为什么Ruby在%q内查看并逃脱\

我使用Ruby生成Latex代码。我需要生成{Late}用于制作表格的\\\hline。我发现\\\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确实发出了警告

   warning: encountered \r in middle of line, treated as a mere space

但是这不应该生成,因为这应该是转义字符串吗?

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

file = open('foo4.txt', 'w')
str = r"""\\\hline"""
file.write(str)
file.close()

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

我在Ruby中做错了什么?

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

2 个答案:

答案 0 :(得分:3)

str = <<'TEXT'
hello %s
\\\hline
%s
TEXT

name = "Graig"
msg = "Goodbye"
puts str % [name, msg]

当它的分隔符是单引号时,heredoc没有转义字符。它确实有一种插值形式。上面的代码有这个输出:

hello Graig
\\\hline
Goodbye

更多的想法是使用哈希进行插值:

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

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

输出:

hello Graig
\\\hline
Goodbye, Graig

答案 1 :(得分:1)

%q%Q分别是单引号和双引号字符串的替代品。它们通常在字符串本身包含引号时使用(HTML是一个典型示例),因此它可以避免噪声引用转义。

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

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

# >> \\\hline 'some words'

https://en.wikibooks.org/wiki/Ruby_Programming/Strings#Single_quotes