Elliot Shank > Perl-Critic-1.089 > Perl::Critic::Policy::ControlStructures::ProhibitMutatingListFunctions

Download:
Perl-Critic-1.089.tar.gz

Dependencies

Annotate this POD

Website

CPAN RT

New  23
Open  64
Stalled  2
View Bugs
Report a bug
Module Version: 1.089   Source   Latest Release: Perl-Critic-1.105

NAME ^

Perl::Critic::Policy::ControlStructures::ProhibitMutatingListFunctions - Don't modify $_ in list functions.

AFFILIATION ^

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

DESCRIPTION ^

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

CONFIGURATION ^

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

LIMITATIONS ^

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.

AUTHOR ^

Chris Dolan <cdolan@cpan.org>

Michael Wolf <MichaelRWolf@att.net>

COPYRIGHT ^

Copyright (C) 2006 Chris Dolan. All rights reserved.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.