in reply to Leaking Regex Captures

It looks to me like the regex is getting confused when it is backtracking. As BioLion notes above, jwrahn's explanation fits the output perfectly if we remove the \s* between each letter and digit, but it doesn't fit the output when the \s* is still in place.

while (<main::DATA>) { chomp; print "\nTesting '$_'\n"; /^(?:(?:(\d+)c\s*)|(?:(\d+)w\s*)|(?:(\d+)r\s*))+/i; print "Without \\s* : 1='$1', 2='$2', 3='$3'\n"; /^(?:(?:(\d+)\s*c\s*)|(?:(\d+)\s*w\s*)|(?:(\d+)\s*r\s*))+/i; print "With \\s* : 1='$1', 2='$2', 3='$3'\n"; }

outputs

Testing '1c' Without \s* : 1='1', 2='', 3='' With \s* : 1='1', 2='', 3='' Testing '2w' Without \s* : 1='', 2='2', 3='' With \s* : 1='', 2='2', 3='' Testing '2c3w' Without \s* : 1='2', 2='3', 3='' With \s* : 1='3', 2='3', 3='' Testing '1w1w' Without \s* : 1='', 2='1', 3='' With \s* : 1='1', 2='1', 3='' Testing '1w2r' Without \s* : 1='', 2='1', 3='2' With \s* : 1='2', 2='2', 3='2' Testing '2r1c' Without \s* : 1='1', 2='', 3='2' With \s* : 1='1', 2='', 3='2'

Best, beth