Perl::Critic::Policy::BuiltinFunctions::ProhibitUselessTopic(3pm) User Contributed Perl Documentation Perl::Critic::Policy::BuiltinFunctions::ProhibitUselessTopic(3pm)

Perl::Critic::Policy::BuiltinFunctions::ProhibitUselessTopic - Don't pass $_ to built-in functions that assume it, or to most filetest operators.

This Policy is part of the Perl::Critic distribution.

There are a number of places where $_, or "the topic" variable, is unnecessary.

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.

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 $_

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.

This Policy is not configurable except for the standard options.

Andy Lester <andy@petdance.com>

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.

2023-07-26 perl v5.38.0