With .. the first condition is only evaluated when .. is in the "inactive" state. The second condition is only evaluated when .. is in the "active" state. And that is the behavior I am (implicitly) proposing - that only the condition corresponding to the current state be evaluated.
So, an initial draft of till might be:
sub till
{
my $state = lookupState(caller);
croak('Fatal: till: Too few conditions for current state.')
if ((2 * $state) >= @_);
if ref($_[2 * $state]) eq 'SCALAR' {
$state++ if ($_[2 * $state]);
} elsif ref($_[2 * $state]) eq 'Regexp' {
$state++ if (/$_[2 * $state]/);
} elsif ref($_[2 * $state]) eq 'CODE' {
$state++ if ($_[2 * $state]->($_));
}
saveState($state, caller);
if ((2 * $state) >= @_) { # final condition was true
saveState(0, caller);
return 0;
}
return 0 if ($state < 1); # init condition still false
return $_[2 * ($state - 1)]->($_);
}
Note: The above actually behaves like ... in that only 1 condition is evaluated per invocation.
Disclaimer: Not yet tested. |