BEGIN { $OPS{'num'}{$_} = eval "sub { \$_[0] $_ \$_[1] }" foreach (qw(< <= != >= > ==)); $OPS{'str'}{$_} = eval "sub { \$_[0] $_ \$_[1] }" foreach (qw(lt le ne ge gt eq)); } # ... and later ... $v = ${$pairs{$ca}}[0]; my $op_type = $types{$ca} ? 'num' : 'str'; my $op = $OPS{$op_type}{$co}; die("Undefined operation $co.\n") unless $op; $r &= $op->($v, $cv);