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: "\[="
5467
5467
and "=\]". The S<<-- HERE> shows whereabouts in the regular expression the
5468
5468
problem was discovered. See L<perlre>.
5469
5469
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 at 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
+
5470
5497
=item Possible attempt to put comments in qw() list
5471
5498
5472
5499
(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
49
49
Possible attempt to put comments in qw() list
50
50
@a = qw(a b # c) ;
51
51
52
+ Possible attempt to escape whitespace in qw() list
53
+ @a = qw( foo bar\ baz ) ;
54
+
52
55
%s (...) interpreted as function
53
56
print ("")
54
57
printf ("")
@@ -366,6 +369,12 @@ Possible attempt to separate words with commas at - line 3.
366
369
Possible attempt to put comments in qw() list at - line 3.
367
370
########
368
371
# 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
369
378
use warnings 'syntax' ;
370
379
print ("");
371
380
print ("") and $x = 1;
Original file line number Diff line number Diff line change @@ -5821,6 +5821,7 @@ yyl_qw(pTHX_ char *s, STRLEN len)
5821
5821
if (SvCUR (PL_lex_stuff )) {
5822
5822
int warned_comma = !ckWARN (WARN_QW );
5823
5823
int warned_comment = warned_comma ;
5824
+ int warned_escape = warned_comma ;
5824
5825
char * d = SvPV_force (PL_lex_stuff , len );
5825
5826
while (len ) {
5826
5827
for (; isSPACE (* d ) && len ; -- len , ++ d )
@@ -5840,6 +5841,11 @@ yyl_qw(pTHX_ char *s, STRLEN len)
5840
5841
"Possible attempt to put comments in qw() list" );
5841
5842
++ warned_comment ;
5842
5843
}
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
+ }
5843
5849
}
5844
5850
}
5845
5851
else {
You can’t perform that action at this time.
0 commit comments