Point 1: "local" is a "rare duck" - it happens seldom. Almost always "my" is better. local is an artifact of previous Perl versions, but it still has uses. Point 2: I figure that setting $_ as an lvalue is a bad idea. That is motivated the fact that Perl can and will do this by itself. Point 3: I have no problem with ternary expressions. But I I do have a problem with an ":" without a "blah;" Point 4: If we have a complex decision with 4 values, probably we can come up with a name for that decision and I'd name a sub{} with that name. Point 5: If the thing we are searching is small and performance is not an issue, I would omit "last" and "next" in the interest of simplicity. So, this is one way to do this.. my $foo = decide($value); sub decide { my $value = shift; my $decision = 'somethin'; foreach ($value) #sets $_ to $value! { $decision = 'wanna' if (/aaa/); $decision = 'be' if (/bbb/); $decision = 'startin' if (/ccc/); } return ($decision ); }