The PBP suggests one simple thing for using other postfix control structures, such as unless, for, while, and until. It says: Don’t.
All the comments Mr. Conway makes about block forms being easier to read in most cases, and about avoiding $_ are strong, as far as I’m concerned. Not being able to name the iterator means that if you’re doing something more than trivial, you wind up using $_ or the even stranger defaults.
print for grep {defined $_} @generated_lines;
This makes my teeth squeak, especially when it’s so much clearer in the block form, for the cost of two extra lines with { and } on them. Oh wait, that’s a benefit here.
In general, avoid most of the postfix operators, except when it isn’t clearer.
You really don’t need the topicalizer in that line, which can be simplified like so:
print for grep {defined} @generated_lines;
In fact, you don’t need the “for” either, since “print” can deal with a list:
print grep {defined} @generated_lines;
A good example would involve some code treating each list element by itself. Perhaps something like this:
foo($_) for @list;
I happen to like this construct due to its terseness. I tend to use “for” whenever the code dealing with the list elements is really small, like a routine call.
BTW, I’m enjoying your series of posts about PBP. Keep on!