.\" -*- mode: troff; coding: utf-8 -*- .\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie n \{\ . ds C` "" . ds C' "" 'br\} .el\{\ . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "Perl::Critic::Policy::ControlStructures::ProhibitPostfixControls 3pm" .TH Perl::Critic::Policy::ControlStructures::ProhibitPostfixControls 3pm 2023-07-26 "perl v5.38.0" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH NAME Perl::Critic::Policy::ControlStructures::ProhibitPostfixControls \- Write "if($condition){ do_something() }" instead of "do_something() if $condition". .SH AFFILIATION .IX Header "AFFILIATION" This Policy is part of the core Perl::Critic distribution. .SH DESCRIPTION .IX Header "DESCRIPTION" Conway discourages using postfix control structures (\f(CW\*(C`if\*(C'\fR, \f(CW\*(C`for\*(C'\fR, \&\f(CW\*(C`unless\*(C'\fR, \f(CW\*(C`until\*(C'\fR, \f(CW\*(C`when\*(C'\fR, \f(CW\*(C`while\*(C'\fR) because they hide control flow. The \f(CW\*(C`unless\*(C'\fR and \f(CW\*(C`until\*(C'\fR controls are particularly evil because they lead to double-negatives that are hard to comprehend. The only tolerable usage of a postfix \f(CW\*(C`if\*(C'\fR/\f(CW\*(C`when\*(C'\fR is when it follows a loop break such as \f(CW\*(C`last\*(C'\fR, \f(CW\*(C`next\*(C'\fR, \f(CW\*(C`redo\*(C'\fR, or \f(CW\*(C`continue\*(C'\fR. .PP .Vb 2 \& do_something() if $condition; # not ok \& if ($condition) { do_something() } # ok \& \& do_something() while $condition; # not ok \& while ($condition) { do_something() } # ok \& \& do_something() unless $condition; # not ok \& do_something() unless ! $condition; # really bad \& if (! $condition) { do_something() } # ok \& \& do_something() until $condition; # not ok \& do_something() until ! $condition; # really bad \& while (! $condition) { do_something() } # ok \& \& do_something($_) for @list; # not ok \& \& LOOP: \& for my $n (0..100) { \& next if $condition; # ok \& last LOOP if $other_condition; # also ok \& \& next when m< 0 \ez >xms; # fine too \& } .Ve .SH CONFIGURATION .IX Header "CONFIGURATION" A set of constructs to be ignored by this policy can specified by giving a value for 'allow' of a string of space-delimited keywords: \&\f(CW\*(C`if\*(C'\fR, \f(CW\*(C`for\*(C'\fR, \f(CW\*(C`unless\*(C'\fR, \f(CW\*(C`until\*(C'\fR, \f(CW\*(C`when\*(C'\fR, and/or \f(CW\*(C`while\*(C'\fR. An example of specifying allowed flow-control structures in a \&\fI.perlcriticrc\fR file: .PP .Vb 2 \& [ControlStructures::ProhibitPostfixControls] \& allow = for if until .Ve .PP By default, all postfix control keywords are prohibited. .PP The set of flow-control functions that are exempt from the restriction can also be configured with the 'flowcontrol' directive in your \&\fI.perlcriticrc\fR file: .PP .Vb 2 \& [ControlStructures::ProhibitPostfixControls] \& flowcontrol = warn die carp croak cluck confess goto exit .Ve .PP This is useful if you're using additional modules that add things like \&\f(CW\*(C`assert\*(C'\fR or \f(CW\*(C`throw\*(C'\fR. .SH NOTES .IX Header "NOTES" The \f(CW\*(C`die\*(C'\fR, \f(CW\*(C`croak\*(C'\fR, and \f(CW\*(C`confess\*(C'\fR functions are frequently used as flow-controls just like \f(CW\*(C`next\*(C'\fR or \f(CW\*(C`last\*(C'\fR. So this Policy does permit you to use a postfix \f(CW\*(C`if\*(C'\fR when the statement begins with one of those functions. It is also pretty common to use \f(CW\*(C`warn\*(C'\fR, \f(CW\*(C`carp\*(C'\fR, and \f(CW\*(C`cluck\*(C'\fR with a postfix \f(CW\*(C`if\*(C'\fR, so those are allowed too. .PP The \f(CW\*(C`when\*(C'\fR keyword was added to the language after Perl Best Practices was written. This policy treats \f(CW\*(C`when\*(C'\fR the same way it does \f(CW\*(C`if\*(C'\fR, i.e. it's allowed after flow-control constructs. Thanks to brian d foy for the inspiration . .SH BUGS .IX Header "BUGS" Look for the \f(CW\*(C`do {} while\*(C'\fR case and change the explanation to point to page 123 when it is found. RT #37905. .SH AUTHOR .IX Header "AUTHOR" Jeffrey Ryan Thalhammer .SH COPYRIGHT .IX Header "COPYRIGHT" Copyright (c) 2005\-2011 Imaginative Software Systems. All rights reserved. .PP This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. The full text of this license can be found in the LICENSE file included with this module.