gsubのマッチ部分を引数にしたい

文字列の中に埋め込まれた引数を取り出して何かのメソッドを呼び、その結果で文字列を置換します。

具体例として、テキスト中の

## call [1,2,3]##

と書いてある部分から、[1,2,3]の部分を取り出し、文字列ではなく配列としてcallメソッドに渡します。

  • 悪い例
gsub!(/##call (\[.*?\])##/, call(eval("\\1")))

ついこう書いてしまうんですが、エラーが出て動きません。eval("\\1")が処理されるのは、マッチの前だから。
"\\1"の部分を$1に変えればエラーにはなりませんが、ちゃんと動きません。前のマッチの結果しか入ってませんから。

  • 良い例
gsub!(/##call (\[.*?\])##/) {call(eval($1))}

「使用前」と「使用後」を、ひとつの()内に書かずに、
(使用前){使用後}
と分ける*1のがミソです。

*1:第2引数を省略すると、イテレータになるそうです。