hmm... how about a suggestion on a different approach? You could put your rule base into a hash, with the 'action' possibilities as keys, storing a hashref with the 'sort' and 'msgid' etc. keys, like this (truncated) example:
my %RULES = (
'post' => { 'msgid' => '^(\d+|new)$', 'data' => '...', },
'edit' => { 'msgid' => '^(\d+|new)$', },
...,
};
my $allowed = $RULES{ $query->{'action'} };
foreach $key (keys %$query) {
exists $allowed->{'key'} ? 1 : return 0;
...
}
Or, since it seems pretty obvious there can be only one action type at a time, you could probably cascade the trinary operator, like so:
for ($query->{'action'}) {
$allowed = /post/ ? { ... } :
/edit/ ? { ... } :
/delete/ ? { ... } :
die "that action isn't supported";
}
or any variation you like there. The hash-based one is probably faster.
local $_ = "0A72656B636148206C72655020726568746F6E41207473754A";
while(s/..$//) { print chr(hex($&)) }