2016-02-29 2 views
0

Я пытаюсь переписать команду, чтобы заменить выходные файлы теми же файлами в другом каталоге, создавая карту перевода. В Perl я мог бы сделать что-то вроде этого:Что такое Ruby-эквивалент Perl's {} {} e?

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[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

Смежные вопросы