Are you sure you want to execute last
only when $has_even = 1
is true? Using "and" would be confusing if you decide later to refactor the code and suddenly end up with
$_ % 2 and $has_odd = 0 and last;
or maybe the second "and" would be turned to "or", but it would be confusing anyway.
More idiomatic way of writing this would be
$_ % 2 or $has_even = 1, last;
if you insisted on using no if/unless. I'd probably use
$has_even = 1, last unless $_ % 2;
Update: s/if/unless/. Thanks Athanasius.