Ruby一行代码:编写一个兼容POSIXshell的TSV格式



我正在寻找一种输出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")

相关内容

  • 没有找到相关文章

最新更新