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 usually harmless, in as much as the intention is a literal "*" and that's what it gives, but it's unnecessary, and on that basis this policy is under the cosmetic theme (see "POLICY THEMES" in Perl::Critic). It's also possible however an unnecessary backslash is a misunderstanding interpolation, or a typo.

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";       # provokes Perl warning

This policy extends to report on any unknown escape, with options below to vary the strictness, and check single-quote strings too if desired.

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 the default with no such version at all is to allow them too.

print "\777";            # ok

use 5.006;
print "\N{APOSTROPHE}";  # ok

use 5.005;
print "\N{COLON}";       # bad

The absense of a use is treated as 5.6 because that's most likely 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())}

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 are

none       don't report anything
alnum      report unknown alphanumerics, like Perl's warning
quotemeta  report anything C<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 at all.

"quotemeta" means report escapes not produced by quotemeta(). For example quotemeta 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 if you use quotemeta 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 for double above, though only "all" or "none" make much sense.

"single" defaults to "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 a bit 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 left alone by this policy. qx{} backticks are normally double-quote, but qx'' is single-quote.

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 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>.