This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
toke.c: Fix confused interp-in-format parsing
authorFather Chrysostomos <sprout@cpan.org>
Mon, 6 Aug 2012 21:34:25 +0000 (14:34 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Wed, 8 Aug 2012 19:24:49 +0000 (12:24 -0700)
commitb27dce25d7618d1797015079eaecd1913f133d47
tree115ad1052fbc3e1204caf4a831137471668f01ba
parent513b1ee2ffc66290ce706625c54422114d634f98
toke.c: Fix confused interp-in-format parsing

The lexer keeps track of how many levels of brackets it is currently
in (including the = and . delimiting formats, which count as brackets)
in PL_lex_brackets.

When parsing a format, the lexer sets lex_formbrack to the form’s
bracket number.  Whitespace parsing takes note of this, and avoids
reading beyond the end of the current line inside a format, unless it
is in an inner bracketed construct.  So this:

format =
@
$a
 + $b
.

treats ‘ + $b’ as a literal string, which becomes the second line
of output.

But this:

format =
@
{ $a
   + $b }
.

treats the whole {...} block as the argument for the first format pic-
ture line.

For interpolating (i.e., quoted) constructs, the lexer temporarily
resets the bracket count.  This is so that when it reaches the final
brace in "${...}foo()" it can parse the rest (foo()) as a constant,
rather than a sub call.

When the bracket count was reset, lex_formbrack was left as it was,
resulting in confusion:

# ok
format =
@
${; use
    strict}
.

# also ok
format =
@
"${; {use
      strict} }"
.

# syntax error (or crash)
format =
@
"${; use
     strict }"
.

# crash
format =
@
"${ use
    strict }"
.

When the bracket count is localised and reset at the start of a quoted
construct, we now do the same with lex_formbrack.
t/op/write.t
toke.c