---
name: "Perl::Critic::Policy::ControlStructures::ProhibitPostfixControls"
section: "3pm"
platform: "linux"
package: "perl-perl-critic"
version: "1.156-3"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/Perl::Critic::Policy::ControlStructures::ProhibitPostfixControls"
---

# Perl::Critic::Policy::ControlStructures::ProhibitPostfixControls(3pm)

Write "if($condition){ do\_something() }" instead of "do\_something() if $condition".

## NAME

Perl::Critic::Policy::ControlStructures::ProhibitPostfixControls - Write "if($condition){ do\_something() }" instead of "do\_something() if $condition".

## AFFILIATION

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

## DESCRIPTION

Conway discourages using postfix control structures (`"if"`, `"for"`, `"unless"`, `"until"`, `"when"`, `"while"`) because they hide control flow.  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"`/`"when"` 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
    LOOP:
    for my $n (0..100) {
        next if $condition;                 # ok
        last LOOP if $other_condition;      # also ok
        next when m< 0 \z >xms;             # fine too
    }
```

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

```
    [ControlStructures::ProhibitPostfixControls]
    allow = for if until
```

By default, all postfix control keywords are prohibited.

The set of flow-control functions that are exempt from the restriction can also be configured with the 'flowcontrol' directive in your *.perlcriticrc* file:

```
    [ControlStructures::ProhibitPostfixControls]
    flowcontrol = warn die carp croak cluck confess goto exit
```

This is useful if you're using additional modules that add things like `"assert"` or `"throw"`.

## NOTES

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.

The `"when"` keyword was added to the language after Perl Best Practices was written.  This policy treats `"when"` the same way it does `"if"`, i.e. it's allowed after flow-control constructs.  Thanks to brian d foy for the inspiration \<http://www.effectiveperlprogramming.com/blog/543\>.

## BUGS

Look for the `"do {} while"` case and change the explanation to point to page 123 when it is found.  RT #37905.

## AUTHOR

Jeffrey Ryan Thalhammer \<jeff@imaginative-software.com\>

## COPYRIGHT

Copyright (c) 2005-2011 Imaginative Software Systems.  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.
