From 2d01290cfd1a34b1ab7cde84612c2e9408ed2be6 Mon Sep 17 00:00:00 2001 From: akr Date: Tue, 18 Dec 2007 11:26:24 +0000 Subject: * parse.y (arg tMATCH arg): call reg_named_capture_assign_gen if regexp literal is used. (reg_named_capture_assign_gen): assign the result of named capture into local variables. [ruby-dev:32588] * re.c: document the assignment by named captures. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14297 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- re.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 're.c') diff --git a/re.c b/re.c index a8774237af..55037856ed 100644 --- a/re.c +++ b/re.c @@ -2164,6 +2164,37 @@ reg_match_pos(VALUE re, VALUE *strp, long pos) * * /at/ =~ "input data" #=> 7 * /ax/ =~ "input data" #=> nil + * + * If =~ is used with a regexp literal with named captures, + * captured strings (or nil) is assigned to local variables named by + * the capture names. + * + * /(?\w+)\s*=\s*(?\w+)/ =~ " x = y " + * p lhs #=> "x" + * p rhs #=> "y" + * + * If it is not matched, nil is assigned for the variables. + * + * /(?\w+)\s*=\s*(?\w+)/ =~ " x = " + * p lhs #=> nil + * p rhs #=> nil + * + * This assignment is implemented in the Ruby parser. + * So a regexp literal is required for the assignment. + * The assignment is not occur if the regexp is not a literal. + * + * re = /(?\w+)\s*=\s*(?\w+)/ + * re =~ " x = " + * p lhs # undefined local variable + * p rhs # undefined local variable + * + * A regexp interpolation, #{}, also disables + * the assignment. + * + * rhs_pat = /(?\w+)/ + * /(?\w+)\s*=\s*#{rhs_pat}/ =~ "x = y" + * p lhs # undefined local variable + * */ VALUE -- cgit v1.2.3