什么是相当于Perl的{} {} e?

时间:2016-02-29 14:52:29

标签: ruby regex perl language-comparisons

我正在尝试重写一个命令,用另一个目录中的相同文件替换输出文件,构建翻译映射。在Perl中我可以这样做:

s{(-o|--out)\s((?:\S+\/)?(\S+))}{ "$1 " . ($m{$2}="foo/$3") }eg

我不清楚如何在Ruby下做同样的事情,因为:

"-out AAA -out yeah/BBB".
gsub(/((?:\s|^)-out)\s+((?:\S+\/)?(\S+))/) { |f|
  "#{f[1]} #{m[f[2]] = "temp/#{f[3]}"}"
}

结果

"o temp/t- temp/u"

因为'm'是匹配的字符串,而不是匹配对象,所以#{m[1]}只是匹配字符串的第二个字符。

我不想使用$1$2因为Rubocop说它们是邪恶的,我宁愿不使用'Regexp.last_match',因为它非常冗长并且变成了这个单行成为一个块。

是否没有内置功能可以将匹配对象作为参数?

1 个答案:

答案 0 :(得分:1)

如果您不想像在perl中那样使用$1,则可以使用命名匹配:

"-out AAA -out BBB".gsub(/(?<leading>\s|^)(?<out>-out)\s+(?<rest>\S+)/) do
  "#{$~[:leading]}#{$~[:out]} BLOCK"
end
#⇒ "-out BLOCK -out BLOCK"

另一种选择是关闭rubocop,因为你知道你在做什么:

#rubocop:disable Style/PerlBackrefs
"-out AAA -out BBB".gsub(/(\s|^)(-out)\s+(\S+)/) do
  "#{$1}#{$2} BLOCK"
end
#rubocop:enable Style/PerlBackrefs