NAME
Perl::Critic::Policy::ValuesAndExpressions::ProhibitUnknownBackslash - don't use undefined backslash forms
DESCRIPTION
This policy is part of the Perl::Critic::Pulp
addon. It checks for unknown backslash escapes like
print "\*.c"; # bad
This is harmless, assuming the intention is a literal "*" (which it gives), but unnecessary, and on that basis this policy is under the cosmetic
theme (see "POLICY THEMES" in Perl::Critic). Sometimes it can be a misunderstanding or a typo though, for instance a backslashed newline is a newline, but perhaps you thought it meant a continuation.
print "this\ # bad
is a newline";
Perl already warns about unknown escaped alphanumerics like \v
under perl -w
or use warnings
(see "Unrecognized escape \\%c passed through" in perldiag).
print "\v"; # bad, and provokes Perl warning
This policy extends to report on any unknown escape, with options below to vary the strictness and to check single-quote strings too if desired.
Control Characters \c
Control characters \cX
are checked and only the conventional A-Z a-z @ [ \ ] ^ _ ? are considered known.
print "\c*"; # bad
Perl accepts any \c
and does an upcase and xor 0x40, so \c*
is the letter j, on an ASCII system at least. But that's quite obscure and likely to be a typo or error.
For reference, \c\
is the ASCII FS "file separator" and the second backslash is not an escape, except for a closing quote character, which it does escape (basically because Perl scans for a closing quote before considering interpolations). Thus,
print " \c\ "; # ok, control-\ FS
print " \c\" "; # bad, control-" is unknown
print qq[ \c\] ]; # ok, control-] GS
Wide Chars
\N{}
named unicode and \777
octal escapes above 255 are new in Perl 5.6. They're considered known if the document has a use 5.006
or higher, or if there's no use
version at all.
print "\777"; # ok
use 5.006;
print "\N{APOSTROPHE}"; # ok
use 5.005;
print "\N{COLON}"; # bad
The absence of a use
is treated as 5.6 because that's most likely, especially if you have those escapes intentionally. But perhaps this will change, or be configurable.
In the violation messages a non-ascii or non-graphical escaped char is shown as hex like \{0x263A}
, to ensure the message is printable and unambiguous.
Other Notes
Interpolated $foo
or @{expr}
variables and expressions are parsed like Perl does, so backslashes for refs there are ok, in particular tricks like ${\scalar ...}
are fine (see "How do I expand function calls in a string?" in perlfaq4).
print "this ${\(some()+thing())}"; # ok
As always, if you're not interested in any of this then you can disable ProhibitUnknownBackslash
from your .perlcriticrc in the usual way,
[-ValuesAndExpressions::ProhibitUnknownBackslash]
CONFIGURATION
double
(string, default "all")heredoc
(string, default "all")-
double
applies to double-quote strings""
,qq{}
,qx{}
, etc.heredoc
applies to interpolated here-documents<<HERE
etc. The possible values arenone don't report anything alnum report unknown alphanumerics, like Perl's warning quotemeta report anything quotemeta() doesn't escape all report all unknowns
"alnum" does no more than compiling with
perl -w
, but might be good for checking code you don't want to run."quotemeta" reports escapes not produced by
quotemeta()
. For examplequotemeta
escapes a*
, so\*
is not reported, but it doesn't escape an underscore_
, so\_
is reported. The effect is to prohibit a few more escapes than "alnum". One use is to check code generated by other code where you've usedquotemeta
to produce double-quoted strings and thus may have escaping which is unnecessary but works fine. single
(string, default "none")-
single
applies to single-quote strings''
,q{}
,qx''
, etc. The possible values are as above, though only "all" or "none" make much sense.none don't report anything all report all unknowns
The default is "none" because literal backslashes in single-quotes are usually both what you want and quite convenient. Setting "all" effectively means you must write backslashes as
\\
.print 'c:\my\msdos\filename'; # bad under "single=all" print 'c:\\my\\msdos\\filename'; # ok
Doubled backslashing like this is correct, and can emphasise that you really did want a backslash, but it's tedious and not easy on the eye and so is left only as an option.
For reference, single-quote here-documents
<<'HERE'
don't have any backslash escapes and so are not considered by this policy.qx{}
command backticks are double-quote but asqx''
is single-quote and in each case treated under the corresponding single/double option.
SEE ALSO
Perl::Critic::Pulp, Perl::Critic, "Quote and Quote-like Operators" in perlop
HOME PAGE
http://user42.tuxfamily.org/perl-critic-pulp/index.html
COPYRIGHT
Copyright 2009, 2010, 2011 Kevin Ryde
Perl-Critic-Pulp is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version.
Perl-Critic-Pulp is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with Perl-Critic-Pulp. If not, see <http://www.gnu.org/licenses>.