Closed p5pRT closed 20 years ago
The following program:
#!perl -w %a = ( one => 1 ); %b = ( one => 1 );
produces the output
Unquoted string "one" may clash with future reserved word at /tmp/test.pl line 4.
It appears that the auto-quoting behaviour of the => operator does not work if a newline intervenes between the unquoted word and the =>.
The perlop manpage just says
The => digraph is mostly just a synonym for the comma operator. It's useful for documenting arguments that come in pairs. As of release 5.001\, it also forces any word to the left of it to be interpreted as a string.
If the behaviour of => is left unchanged\, this should be changed to something like
it also forces an unquoted word to the left of it on the same line to be interpreted as a string.
Alternatively\, the behaviour of => could be changed so that any amount of whitespace can intervene between the unquoted word and the operator.
Here's the sample code:
%a = (one => 1); # no warning %a = (one => 1); # warning about "bareword interpreted..."
This should be fixed in the tokenizer and not the documentation. Any takers?
Nat
Nathan Torkington wrote:
Here's the sample code:
%a = (one => 1); # no warning %a = (one => 1); # warning about "bareword interpreted..."
This should be fixed in the tokenizer and not the documentation. Any takers?
This works for small values of tested. I leave possible side effect prevention to someone who knows what they're doing.
Rick
*** perl-5.5.670/toke.c.old Sat Feb 26 00:24:50 2000
--- perl-5.5.670/toke.c Wed Mar 22 12:07:18 2000
***************
*** 3767\,3776 ****
}
}
- /* If followed by a paren\, it's certainly a subroutine. */
PL_expect = XOPERATOR;
s = skipspace(s);
if (*s == '(') {
CLINE;
if (gv && GvCVu(gv)) {
--- 3767\,3785 ----
}
}
PL_expect = XOPERATOR;
s = skipspace(s);
+
+ /* Is this a word before a => operator? */
+ if (strnEQ(s\,"=>"\,2)) {
+ CLINE;
+ yylval.opval = (OP*)newSVOP(OP_CONST\, 0\, newSVpv(PL_tokenbuf\,0));
+ yylval.opval->op_private = OPpCONST_BARE;
+ TERM(WORD);
+ }
+
+ /* If followed by a paren\, it's certainly a subroutine. */
if (*s == '(') {
CLINE;
if (gv && GvCVu(gv)) {
Fixed by Change 5977 4/27 in perl current
Migrated from rt.perl.org#838 (status was 'resolved')
Searchable as RT838$