我正在寻找一种输出TSV记录的简洁方法,该方法可以使用POSIX shell(IFS='<TAB>' read -r
+printf %b
(准确读取和取消映射。
最低限度的转义规则是:
\
表示反斜杠- 换行符的
n
- 选项卡的
t
- 回车
r
但是它们可以扩展到完全支持的printf
集,如果有一种使用ruby的简单方法的话。
到目前为止的代码:
record = [ "\", "t", "n", "r", """ ]
rules = {
"\" => "\\",
"t" => "\t",
"r" => "\r",
"n" => "\n"
};
regex = /#{ rules.keys.map{|c| Regexp.escape(c)}.join(?|) }/;
puts record.map { |field| field.gsub(regex) {|c| rules[c]} }.join("t")
输出:
\ t n r "
主要的问题是,该代码是针对一行代码的,因此,如果可能的话,我想大大减少它。有什么想法吗?
在Ruby中,每个程序都可以写成一行,由于换行符是可选的:换行符可以具有的每个功能(表达式分隔符、引入语法块等(也可以由符号(例如作为表达式分隔符的;
(或关键字(例如用于引入条件表达式的结果块的then
或用于引入case
表达式的do
或用于引入CCD 12或for
循环的主体的CCD_13等(执行
例如,您的代码可以写成这样的一行代码:
record = [ "\", "t", "n", "r", """ ]; rules = { "\" => "\\", "t" => "\t", "r" => "\r", "n" => "\n" }; regex = /#{ rules.keys.map{|c| Regexp.escape(c)}.join(?|) }/; puts record.map { |field| field.gsub(regex) {|c| rules[c]} }.join("t")
但是,我们可以对代码进行一些可能的改进。
用Regexp::union
构建regex
:
regex = Regexp.union(rules.keys)
既然您已经经历了构造替换Hash
的麻烦,为什么不使用以替换Hash
为自变量的String#gsub
的形式:
puts record.map { |field| field.gsub(regex, rules) }.join("t")