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