my $checks = [ { test => sub { my $state = shift; my $tok = shift; if ($state->{checkPrefix}) { return $state->{base} = &driveBase($canon{$tok}, {%$Args, checkPrefix=>0})); } return; }, action => sub { my $state = shift; my $tok = shift; &equivWord($tok, $cannon{$tok}, {}); }, }, # Check number 2 { test => sub { ... }, action => sub { ... }, }, # and so on # Make your last test succeed (test => sub {1}), # and have your default logic go there. ]; while (my $tok = getTok(...)) { resetState($state); foreach my $check (@$checks) { if ($check->test($state, $tok)) { $check->action($state, $tok); last; } } }