From: Keita Yamaguchi Date: 2007-12-22T05:11:18+09:00 Subject: [ruby-dev:32675] /(?a)/ =~ "a" 等によるローカル変数 山口と申します。 昨日の第19回オープンソースサロンで正規表現の named capture の結果がローカル変数に代入されるとおうかがいしましたので色々試していたのですが、現状では予約語のチェックをしていないので予約語の名前を持つローカル変数を作ることが出来ます。そうしたローカル変数が存在したとしても基本的に無害だろうとは思いますが、一応ご報告させて頂きます。 /(?a)/ =~ "a" /(?a)/ =~ "a" /(?a)/ =~ "a" /(?a)/ =~ "a" /(?a)/ =~ "a" /(?a)/ =~ "a" /(?a)/ =~ "a" /(?a)/ =~ "a" /(?a)/ =~ "a" /(?a)/ =~ "a" /(?a)/ =~ "a" /(?a)/ =~ "a" p local_variables #=> ["nil", "and", "begin", "break", "case", "if", "self", "true", "false", "alias", "def", "super"] Index: parse.y =================================================================== --- parse.y (リビジョン 14430) +++ parse.y (作業コピー) @@ -8513,7 +8513,8 @@ arg->fail_block = NEW_BEGIN(0); } - if (!(len && rb_enc_islower(*name, enc) && rb_enc_symname2_p(s, len, enc))) { + if (!(len && rb_enc_islower(*name, enc) && rb_enc_symname2_p(s, len, enc)) + || rb_reserved_word(name, len)) { compile_error(PARSER_ARG "named capture with a non local variable - %.*s", len, name); return ST_CONTINUE; --- 山口慶太 北海道大学大学院文学研究科D3 keita.yamaguchi@gmail.com