Я пытаюсь переписать команду, чтобы заменить выходные файлы теми же файлами в другом каталоге, создавая карту перевода. В 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- блок.
Нет ли встроенного встроенного устройства, который дает мне объект соответствия в качестве параметра?
Вы можете использовать именованные совпадения с gsub, поэтому вам не нужно полагаться на '$ 1' и' $ 2'. Передайте их в блок, как и любые другие аргументы блока. – Mohamad