Ruby 如何处理反斜杠\&引用;q字符串中的转义字符和heredocument
我是鲁比新手。我不明白为什么Ruby会在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 鲁比确实
%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使这一点非常困难。Pythonr“”“实际上对我想要的效果最好,因为它处理所有的反斜杠,并且允许我在中间使用附加或插入字符串,而不需要使用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