質問: STDIN.gets # v 5 と入力 tbl_cmd.each do |c| if /#{c[:regexp]}/ =~ cmd puts "match" # => match p $1 # => "5" 後方参照できている p c[:cmd] # => ":direct " 後方参照 $1 の "5" が表示されない p eval(c[c:cmd]) # => :direct で eval しても同様 end end ``` ### 実行結果 ``` $ ruby regex.rb v 5 # v 5 と入力 match "5" ":direct " ``` となり、 v 5 と入力した場合、 if 文中において、$1 とすると、キャプチャした内容を後方参照できているのですが、 p c[:cmd] とすると、 c[:cmd] の、$1 部分は、キャプチャした内容を後方参照できずに、悩んでいます。 p eval(c[:cmd]) でも同様です。 どのようにすればよいか、ご教示いただけないでしょうか?
回答: これはだめです。 `tbl_cmd`への代入の時点での`$1`の値(多分空文字列)が展開されて`tbl_cmd[:cmd]`にセットされます。 どうしたら良いかはちょっと考えてみます。 追記 == 元の物に近くするには、`eval`を使うしか無さそうです。 ``` tbl_cmd = [ { regexp: '^ *v +(\d+) *$', cmd: '":direct #{$1}"'}, ] cmd = STDIN.gets # v 5 と入力 tbl_cmd.each do |c| if /#{c[:regexp]}/ =~ cmd puts "match" p $1 p eval(c[:cmd]) end end ```