Ruby 等同于 Perl 的 s{}{}e 是什么?
What's the Ruby equivalent of Perl's s{}{}e?
我正在尝试重写一个命令,用不同目录中的相同文件替换输出文件,从而构建一个翻译映射。在 Perl 中我可以这样做:
s{(-o|--out)\s((?:\S+\/)?(\S+))}{ " " . ($m{}="foo/") }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]}
只是匹配字符串的第二个字符
我不想使用 </code>、<code>
因为 Rubocop 说他们是邪恶的,我不想使用 'Regexp.last_match' 因为它非常冗长而且把这个单行代码变成一个 do-block。
没有内置函数给我匹配对象作为参数吗?
如果您不想像在 perl 中那样使用 </code>,您可以使用命名匹配:</p>
<pre><code>"-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
"#{}#{} BLOCK"
end
#rubocop:enable Style/PerlBackrefs
我正在尝试重写一个命令,用不同目录中的相同文件替换输出文件,从而构建一个翻译映射。在 Perl 中我可以这样做:
s{(-o|--out)\s((?:\S+\/)?(\S+))}{ " " . ($m{}="foo/") }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]}
只是匹配字符串的第二个字符
我不想使用 </code>、<code>
因为 Rubocop 说他们是邪恶的,我不想使用 'Regexp.last_match' 因为它非常冗长而且把这个单行代码变成一个 do-block。
没有内置函数给我匹配对象作为参数吗?
如果您不想像在 perl 中那样使用 </code>,您可以使用命名匹配:</p>
<pre><code>"-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
"#{}#{} BLOCK"
end
#rubocop:enable Style/PerlBackrefs