【发布时间】:2016-06-12 16:05:40
【问题描述】:
我正在尝试重写一个命令,用不同目录中的相同文件替换输出文件,从而构建翻译映射。在 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”,因为它非常冗长,并且会将这种单行代码变成一个do-block。
是否没有内置函数可以将匹配对象作为参数?
【问题讨论】:
-
您可以将命名匹配与 gsub 一起使用,因此您不必依赖
$1和$2。像任何其他块参数一样将它们传递给块。
标签: ruby regex perl language-comparisons