Perl::Critic::Policy::ControlStructures::ProhibitMutatingListFunctions - Don't modify C<$_> in list functions. |
Perl::Critic::Policy::ControlStructures::ProhibitMutatingListFunctions - Don't modify $_
in list functions.
This Policy is part of the core Perl::Critic distribution.
map
, grep
and other list operators are intended to transform
arrays into other arrays by applying code to the array elements one by
one. For speed, the elements are referenced via a $_
alias rather
than copying them. As a consequence, if the code block of the map
or grep
modify $_
in any way, then it is actually modifying the
source array. This IS technically allowed, but those side effects can
be quite surprising, especially when the array being passed is @_
or perhaps values(%ENV)
! Instead authors should restrict in-place
array modification to for(@array) { ... }
constructs instead, or
use List::MoreUtils::apply()
.
By default, this policy applies to the following list functions:
map grep List::Util qw(first) List::MoreUtils qw(any all none notall true false firstidx first_index lastidx last_index insert_after insert_after_string)
This list can be overridden the .perlcriticrc file like this:
[ControlStructures::ProhibitMutatingListFunctions] list_funcs = map grep List::Util::first
Or, one can just append to the list like so:
[ControlStructures::ProhibitMutatingListFunctions] add_list_funcs = Foo::Bar::listmunge
This policy deliberately does not apply to for (@array) { ... }
or
List::MoreUtils::apply()
.
Currently, the policy only detects explicit external module usage like this:
my @out = List::MoreUtils::any {s/^foo//} @in;
and not like this:
use List::MoreUtils qw(any); my @out = any {s/^foo//} @in;
This policy looks only for modifications of $_
. Other naughtiness
could include modifying $a
and $b
in sort
and the like.
That's beyond the scope of this policy.
There is discussion of this policy at http://perlmonks.org/index.pl.
Chris Dolan <cdolan@cpan.org>
Michael Wolf <MichaelRWolf@att.net>
Copyright (c) 2006-2011 Chris Dolan.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
Perl::Critic::Policy::ControlStructures::ProhibitMutatingListFunctions - Don't modify C<$_> in list functions. |