NAME
Perl::Critic::Policy::BuiltinFunctions::ProhibitUselessTopic - Don't pass $_ to built-in functions that assume it, or to most filetest operators.
AFFILIATION
This Policy is part of the Perl::Critic distribution.
DESCRIPTION
There are a number of places where $_
, or "the topic" variable, is unnecessary.
Topic unnecessary for certain Perl built-in functions
Many Perl built-in functions will operate on $_
if no argument is passed. For example, the length
function will operate on $_
by default. This snippet:
for
(
@list
) {
if
(
length
(
$_
) == 4 ) { ...
is more idiomatically written as:
for
(
@list
) {
if
(
length
== 4 ) { ...
In the case of the split
function, the second argument is the one that defaults to $_
. This snippet:
for
(
@list
) {
my
@args
=
split
/\t/,
$_
;
is better written as:
for
(
@list
) {
my
@args
=
split
/\t/;
There is one built-in that this policy does not check for: reverse
called with $_
.
The reverse
function only operates on $_
if called in scalar context. Therefore:
for
(
@list
) {
my
$backwards
=
reverse
$_
;
is better written as:
for
(
@list
) {
my
$backwards
=
reverse
;
However, the distinction for scalar vs. list context on reverse
is not yet working. See KNOWN BUGS below.
Topic unnecessary for most filetest operators
Another place that $_
is unnecessary is with a filetest operator.
# These are identical.
my
$size
= -s
$_
;
my
$size
= -s;
# These are identical.
if
( -r
$_
) { ...
if
( -r ) { ...
The exception is after the -t
filetest operator, which instead of defaulting to $_
defaults to STDIN
.
# These are NOT identical.
if
( -t
$_
) { ...
if
( -t ) { ...
# Checks STDIN, not $_
KNOWN BUGS
This policy flags a false positive on reverse
called in list context, since reverse
in list context does not assume $_
.
my
$s
=
reverse
(
$_
);
# $_ is useless.
my
@a
=
reverse
(
$_
);
# $_ is not useless here.
CONFIGURATION
This Policy is not configurable except for the standard options.
AUTHOR
Andy Lester <andy@petdance.com>
COPYRIGHT
Copyright (c) 2013-2022 Andy Lester <andy@petdance.com>
This library is free software; you can redistribute it and/or modify it under the terms of the Artistic License 2.0.