Benchmark-Perl-Formance-Cargo
view release on metacpan or search on metacpan
share/PerlCritic/Critic/Policy/Variables/ProhibitPunctuationVars.pm view on Meta::CPAN
our $VERSION = '1.108';
#-----------------------------------------------------------------------------
Readonly::Scalar my $DESC => q<Magic punctuation variable used>;
Readonly::Scalar my $EXPL => [79];
#-----------------------------------------------------------------------------
# There is no English.pm equivalent for $].
sub supported_parameters {
return (
{
name => 'allow',
description => 'The additional variables to allow.',
default_string => $EMPTY,
behavior => 'string list',
list_always_present_values =>
[ qw< $_ @_ $1 $2 $3 $4 $5 $6 $7 $8 $9 _ $] > ],
},
{
name => 'string_mode',
description =>
'Controls checking interpolated strings for punctuation variables.',
default_string => 'thorough',
behavior => 'enumeration',
enumeration_values => [ qw< simple disable thorough > ],
enumeration_allow_multiple_values => 0,
},
);
}
sub default_severity { return $SEVERITY_LOW }
sub default_themes { return qw< core pbp cosmetic > }
sub applies_to {
return qw<
PPI::Token::Magic
PPI::Token::Quote::Double
PPI::Token::Quote::Interpolate
PPI::Token::QuoteLike::Command
PPI::Token::QuoteLike::Backtick
PPI::Token::QuoteLike::Regexp
PPI::Token::QuoteLike::Readline
PPI::Token::HereDoc
>;
}
#-----------------------------------------------------------------------------
# This list matches the initialization of %PPI::Token::Magic::magic.
## no critic (ValuesAndExpressions::RequireInterpolationOfMetachars)
Readonly::Array my @MAGIC_VARIABLES =>
qw{
$1 $2 $3 $4 $5 $6 $7 $8 $9
$_ $& $` $' $+ @+ %+ $* $. $/ $|
$\\ $" $; $% $= $- @- %- $)
$~ $^ $: $? $! %! $@ $$ $< $>
$( $0 $[ $] @_ @*
$^L $^A $^E $^C $^D $^F $^H
$^I $^M $^N $^O $^P $^R $^S
$^T $^V $^W $^X %^H
$::|
},
q<$}>,
q<$,>,
q<$#>,
q<$#+>,
q<$#->;
## use critic
# The main regular expression for detecting magic variables.
Readonly::Scalar my $MAGIC_REGEX => _create_magic_detector();
# The magic vars in this array will be ignored in interpolated strings
# in simple mode. See CONFIGURATION in the pod.
Readonly::Array my @IGNORE_FOR_INTERPOLATION =>
( q{$'}, q{$$}, q{$#}, q{$:}, ); ## no critic ( RequireInterpolationOfMetachars, ProhibitQuotedWordLists )
#-----------------------------------------------------------------------------
sub violates {
my ( $self, $elem, undef ) = @_;
if ( $elem->isa('PPI::Token::Magic') ) {
return _violates_magic( $self, $elem );
}
elsif ( $elem->isa('PPI::Token::HereDoc') ) {
return _violates_heredoc( $self, $elem );
}
#the remaining applies_to() classes are all interpolated strings
return _violates_string( $self, $elem );
}
#-----------------------------------------------------------------------------
# Helper functions for the three types of violations: code, quotes, heredoc
sub _violates_magic {
my ( $self, $elem, undef ) = @_;
if ( !exists $self->{_allow}->{$elem} ) {
return $self->violation( $DESC, $EXPL, $elem );
}
return; # no violation
}
sub _violates_string {
my ( $self, $elem, undef ) = @_;
# RT #55604: Variables::ProhibitPunctuationVars gives false-positive on
# qr// regexp's ending in '$'
# We want to analyze the content of the string in the dictionary sense of
# the word 'content'. We can not simply use the PPI content() method to
# get this, because content() includes the delimiters.
( run in 0.511 second using v1.01-cache-2.11-cpan-5511b514fd6 )