2016-02-29 55 views
0

我想重寫一個命令,用不同的目錄中的相同文件替換輸出文件,建立一個翻譯地圖。在Perl我可以做這樣的事情:什麼是Ruby的等同於Perl的{} {} e?

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

我不清楚怎麼辦紅寶石下是相同的,這是因爲:

"-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-塊。

有沒有內置的,給我的匹配對象作爲參數?

+0

您可以使用帶有gsub的命名匹配,因此您不必依賴'$ 1'和'$ 2'。像其他任何塊參數一樣,將它們傳遞給塊。 – Mohamad

回答

1

一旦你不想使用$1你在Perl一樣,你可能會使用命名比賽:

"-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 
+0

謝謝,我已經做了後者,但我從你的迴應推斷,沒有提供匹配對象作爲其參數的gsub? –

+0

不幸的是,沒有。或者,有人可能認爲這是設計,因爲你總是可以訪問全球['$〜'](http://rocket-science.ru/tips/2013/02/26/ruby-predefined-globals/#波代),返回最後一次成功的比賽。由於ruby被設計爲單線程,所以返回最後一個匹配的'gsub'似乎是多餘的。 (以上所有隻是我的假設。) – mudasobwa

相關問題