Conway discourages using postfix control structures (if, for, unless, until, while). The unless and until controls are particularly evil because they lead to double-negatives that are hard to comprehend. The only tolerable usage of a postfix if is when it follows a loop break such as last, next, redo, or continue.

  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
  for my $n (0..100){
      next if $condition;               #ok
      last LOOP if $other_condition;    #also ok


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: if, for, unless, until, and/or while. An example of specifying allowed flow-control structures in a .perlcriticrc file:

 allow = for if until

By default, all postfix control keywords are prohibited.


The die, croak, and confess functions are frequently used as flow-controls just like next or last. So this Policy does permit you to use a postfix if when the statement begins with one of those functions. It is also pretty common to use warn, carp, and cluck with a postfix if, so those are allowed too.


Jeffrey Ryan Thalhammer <thaljef@cpan.org>


Copyright (c) 2005-2007 Jeffrey Ryan Thalhammer. All rights reserved.

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.