File tree Expand file tree Collapse file tree 3 files changed +42
-0
lines changed
Expand file tree Collapse file tree 3 files changed +42
-0
lines changed Original file line number Diff line number Diff line change @@ -5467,6 +5467,33 @@ character class, just escape the square brackets with the backslash: "\[="
54675467and "=\]". The S<<-- HERE> shows whereabouts in the regular expression the
54685468problem was discovered. See L<perlre>.
54695469
5470+ =item Possible attempt to escape whitespace in qw() list
5471+
5472+ (W qw) qw() lists contain items separated by whitespace; contrary to
5473+ what some might expect, backslash characters cannot be used to "protect"
5474+ whitespace from being split, but are instead treated as literal data.
5475+ (You may have used different delimiters than the parentheses shown here;
5476+ braces are also frequently used.)
5477+
5478+ You probably wrote something like this:
5479+
5480+ @list = qw(
5481+ a\ string
5482+ another
5483+ );
5484+
5485+ expecting to get a two elements list containing the strings C<'a string'>
5486+ and C<'another'>. Instead the list will hold four elements: C<'a\'>
5487+ (with a literal backslash), C<'string'> and C<'another'>.
5488+
5489+ If you really want whitespace in your strings, build your list the
5490+ old-fashioned way, with quotes and commas:
5491+
5492+ @list = ( 'a string', 'another' );
5493+
5494+ Note that this warnings is I<only> emitted when the backslash is followed
5495+ by actual whitespace (that C<qw> splits on).
5496+
54705497=item Possible attempt to put comments in qw() list
54715498
54725499(W qw) qw() lists contain items separated by whitespace; as with literal
Original file line number Diff line number Diff line change @@ -49,6 +49,9 @@ toke.c AOK
4949 Possible attempt to put comments in qw() list
5050 @a = qw(a b # c) ;
5151
52+ Possible attempt to escape whitespace in qw() list
53+ @a = qw( foo bar\ baz ) ;
54+
5255 %s (...) interpreted as function
5356 print ("")
5457 printf ("")
@@ -366,6 +369,12 @@ Possible attempt to separate words with commas at - line 3.
366369Possible attempt to put comments in qw() list at - line 3.
367370########
368371# toke.c
372+ use warnings 'qw';
373+ @a = qw( foo bar\ baz );
374+ EXPECT
375+ Possible attempt to escape whitespace in qw() list at - line 3.
376+ ########
377+ # toke.c
369378use warnings 'syntax' ;
370379print ("");
371380print ("") and $x = 1;
Original file line number Diff line number Diff line change @@ -5821,6 +5821,7 @@ yyl_qw(pTHX_ char *s, STRLEN len)
58215821 if (SvCUR (PL_lex_stuff )) {
58225822 int warned_comma = !ckWARN (WARN_QW );
58235823 int warned_comment = warned_comma ;
5824+ int warned_escape = warned_comma ;
58245825 char * d = SvPV_force (PL_lex_stuff , len );
58255826 while (len ) {
58265827 for (; isSPACE (* d ) && len ; -- len , ++ d )
@@ -5840,6 +5841,11 @@ yyl_qw(pTHX_ char *s, STRLEN len)
58405841 "Possible attempt to put comments in qw() list" );
58415842 ++ warned_comment ;
58425843 }
5844+ else if (!warned_escape && * d == '\\' && len > 1 && isSPACE (* (d + 1 )) ) {
5845+ warner (packWARN (WARN_QW ),
5846+ "Possible attempt to escape whitespace in qw() list" );
5847+ ++ warned_escape ;
5848+ }
58435849 }
58445850 }
58455851 else {
You can’t perform that action at this time.
0 commit comments